Linux 技术文档

前言

我为什么要写这个文档,有以下几个目的,一来是培养自己的文档写作能力;二来,是对过去几年所掌握的 Linux 相关技术的一个总结,俗话说“好记性不如烂笔头”;第三,方便自己在忘记某个知识点并且需要用到的时候过来查阅下资料,第四,也希望能够给有需要的Linuxer 提供一些帮助。我会利用业余时间来进行写作,以下所有内容均为我自己总结,除了图片和视频等外部资源来自互联网,大家可以随意转载复制,无需告知。

推荐书籍

如果你是新手,希望对Linux有一个非常全面的了解和掌握,我建议你看《鸟哥的Linux私房菜》,鸟哥是台湾人,所以他的文字叙述风格都是台湾腔哦。但是对Linux讲解最全面的书籍就是这本了,他有2册,基础篇和服务器篇。书很厚,你要慢慢啃。
官网:http://linux.vbird.org/

认识祖师爷

祖师爷–林纳斯

林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds, 1969年~ ),著名的电脑程序员、黑客。Linux内核的发明人及该计划的合作者。托瓦兹利用个人时间及器材创造出了这套当今全球最流行的操作系统(作业系统)内核之一。现受聘于开放源代码开发实验室(OSDL:Open Source Development Labs, Inc),全力开发Linux内核。

来段 TED 的 Linux视频吧

如果你的电脑看不了这段视频,说明你还需要非常努力学习系统、网络知识,才能看到这段视频。

真的想看?可以自己在国内视频网站搜 TED 林纳斯

发行版下载

一般操作系统基本都是老外开发的,网站也是在国外,速度慢,所以,我们可以考虑通过国内的开源镜像站进行下载,常见的有:

网易开源镜像站 http://mirrors.163.com/
阿里云开源镜像站 http://mirrors.aliyun.com/
搜狐开源镜像站 http://mirrors.sohu.com/

我一般使用网易开源镜像站,比如要下载 centos,在http://mirrors.163.com/ 找到 centos,点击进入

选择对应的版本,比如6.9

进入之后选择 isos,然后选择架构,是 x86 还是 x86_64位,通常来说选64位

然后选择CentOS-6.9-x86_64-bin-DVD1.iso 一般安装系统只需要 DVD1即可。

系统选择

RHCE 考试目前是使用红帽企业版7.x 进行的,但是红帽系统需要授权才能激活一些功能,所以为了方便学习,我们通常使用他的社区版本Centos进行使用,不用担心,在使用上你是感觉不出来他和红帽原版有什么特别明显的差别,除了 UI 壁纸变了下颜色,基本看不出有什么特别大的变化,所以我们以 centos 7来进行讲解 如何进行操作系统的安装

1.下载操作系统

参考发行版下载,我们去网易开源镜像站下载
点击下载
下载后在本地得到一个CentOS-7-x86_64-DVD-1611.iso的压缩文件

虚拟机安装配置

通常,我们可以选择2款虚拟机的使用

  • VMware VMware 公司的商业版虚拟机,非常好用,通常你可以在 Windows linux mac 系统上安装使用,具体怎么安装,你自己去搜资料了,没什么难度

  • virtual box 开源跨平台的虚拟机,可以无需注册,免费使用,界面简单,但是功能强大,可以模拟各种主流的操作系统

虚拟机的选择根据自己的喜好,不过还是建议使用 vmware,本篇都是在VMware 进行的。

虚拟机安装完成之后,我们需要做一些简单的调整,点击菜单栏的编辑-首选项

打开如图所示页面,勾选关闭后保持虚拟机运行,避免关闭软件退出虚拟机,然后选择虚拟机保存位置,最好预留足够的空间,避免磁盘不足无法安装

继续点击编辑–虚拟网络编辑器,

打开如图所示界面,点击更改网络设置,设置 vmnat8,也就是nat 模式下的子网 IP 和子网掩码。

设置 vmnat0的网卡接口,不要选自动,容易后期导致系统无法获取 IP 地址

什么是桥接、仅主机模式以及 NAT 模式

  • 桥接模式:通常桥接后获取的 IP 地址段和你物理机器的 IP地址段是一样的,你可以在局域网内的其他设备上 ping 通虚拟机中以桥接模式配置后获得的 IP
  • NAT 模式:NAT,即网络地址转换,这种模式相当于给虚拟机单独划分了一个子网,和物理机的网段是隔离的,局域网内的其他设备无法直接 ping 通内网设备,需要进行端口映射才可以,因为其他设备没有到达虚拟机网段的路由,但是物理机可以直接连接,因为默认就有路由
  • 仅主机模式,这种模式一般我们在学习 linux 不会用到,仅主机模式,是一种比NAT模式更加封闭的的网络连接模式,它将创建完全包含在主机中的专用网络。仅主机模式的虚拟网络适配器仅对主机可见,并在虚拟机和主机系统之间提供网络连接。相对于NAT模式而言,仅主机模式不具备NAT功能,因此在默认情况下,使用仅主机模式网络连接的虚拟机无法连接到Internet。

要想加深对于这块网络知识的理解,你可能需要有 CCNA 的基本知识,对于IP、子网 、网关、DNS、路由、交换机的基本概念有足够清晰的认识。

端口映射

通常,使用 NAT 模式,我们是没有办法从其他机器连接进虚拟机的,需要配置端口映射,将某个虚拟机的某个协议的端口号和 IP映射给物理机才可以,比如有一台机器 IP是172.10.100.130,我们希望将他的 TCP 22端口映射出去,VMware 自带有端口映射工具
点击编辑—虚拟网络编辑器

点击 NAT 网卡—NAT 设置

点击添加,输入主机端口,也就是你物理机的端口以及虚拟机的端口和 IP 以及协议

最终效果如下

保存后后关闭,打开 windows 防火墙

点击高级设置–选择入站规则–新建规则

选择端口

选择协议 TCP,填写端口

选择允许连接


应用于所有

输入一个名称,完成操作

以 Windows 10 为例,点击开始菜单,输入 cmd


输入 ipconfig 查看 IP 地址

这个时候,那就可以在其他设备远程连接了,连接格式是

ssh username@物理机ip 地址 [-p port]

创建虚拟机

1.点击新建–虚拟机,打开向导

2.默认选择自定义,点击下一步

3.虚拟机硬件兼容,默认,点击下一步

4.选择稍后安装操作系统

5.选择操作系统为 Linux,然后在版本中选择 CentOS 64位

6.给虚拟机设置名称,比如 node-server-1,那么当你新建第二台,你可以叫 node-server-2然后选择虚拟机的保存位置,通常设置了默认值则不需要管了,直接下一步

7.选择处理器(CPU)的数量

8.为虚拟机分配内存,通常服务器是不需要安装图形界面的,在资源有限的情况下,设置1g 即可。但是前期学习,最好设置2g,因为要安装图形化界面,比较耗费资源

9.选择网卡类型,默认 NAT 即可

10.选择磁盘控制器类型,默认即可

12.磁盘类型,默认即可

13.创建一块新磁盘

14.默认即可,勾选将文件存储为单个文件

15.设置磁盘的名称,默认与虚拟机名称一致即可


16.完成向导

18.创建完成后,在主界面我的计算机中会看到刚才创建的,点击查看

19.现在虚拟机虽然创建完了,但是启动后没有操作系统,是无法启动的。我们需要进行配置,点击编辑虚拟机设置,选择CD/DVD(IDE) 在右侧点击使用ISO 镜像文件,点击浏览,把我们刚才下载的 ISO 文件加载进来,然后点击开启此虚拟机,或者点击菜单栏的绿色按钮,如图所示都可以


安装 Centos

开机启动镜像

1.虚拟机启动后,有几个选项,当我们把鼠标移动到虚拟机的节目中,你会发现鼠标消失了。我们按键盘的上下键选择第一个项,安装Centos Linux 7

这三个选项分别是

  • 安装系统
  • 检测镜像文件是否完整
  • 进入系统修复模式

我们要从虚拟机切换到物理机,默认是按 ctrl+alt 键,就可以看见鼠标了

设置语言

2.当加载完后,你回看到如下界面,在这个界面,我们主要选择操作系统的默认语言,通常默认即可,如果要要选择中文,需要自己去找,不过一般不建议。因为中文后期学习过程中会出现些问题。另外一个就是要学会熟悉英文,毕竟很多报错都是英文提示的,你去搜相关资料会好搜些,中文的资料大多数都是二手的。


3.点击下一步,切换到一些比较具体的设置中

LOCALIZATION 默认不要随便乱配了。不然会出错,我们主要配置 SOFTWARE和 SYSTEM 中的配置
选择需要安装的软件

在 SOFTWARE 中,默认的 INSTALLATION SOURCE 源是本地的 DVD,这个不用管,除非你下载的是网络安装,需要设置网络源,SOFTWARE SELECTION 我们点击进入,看到如图所示的界面

在 Base Environment栏中我们选择 Server with GUI。后面的软件我们都不需要去勾选,这是后面的课程要讲的内容。选择这项是会安装图形化界面,默认是 Minimal 这个是最小化安装 一般只会安装200多个包,无图形化界面。那么我们第一次学习,还是选择图形界面的吧!选择完后点击 Done 返回,由于界面比较小,我们需要拖动右侧的滚动条,下面,我们配置磁盘,可以看到有感叹号的都是需要我们配置的

配置磁盘

点击配置磁盘,我们可以看到我们刚才为该虚拟机创建的20G 大小的磁盘文件,第一次,我们让他默认自动分区好了,后面会详细介绍分区

这个界面往下来还有一些选项,如果你要手动配置磁盘分区,你需要选择I will configure partitioning 然后点击 Done,会弹出对话框要求你配置磁盘分区,如果需要自动配,选择Done 会返回上级界面

自定义分区

点击+号

添加一个新的挂载点

Linux的目录结构和 Windows 不同,没有 C 盘 D 盘的概念,整个系统的目录结构就是一个倒树状,第一层就是根目录,用/表示,然后在根目录有引导分区/boot 用户家目录/home 等等,那么我们创建分区一般要分如下几个分区

  • 根分区:/ 这个是必选的,通常给磁盘空间的30%
  • 交换分区: swap 通常给内存的2倍,比如2g 内存,那就划分4g,交换分区通常是在物理内存不足的情况下,将内存数据暂时写入磁盘使用。目前随着内存越来越大,交换分区的作用并不大,但是有些软件在安装时需要检测交换分区是否符合标准,比如安装 ORACLE 数据库的时候就会进行检测,所以,设置内存2倍足够。
  • 引导分区:/boot 引导分区是用来存放内核文件、引导程序配置文件等信息,计算机在开机自检后会读取该分区进行操作系统内核的选择。
  • var 目录 该目录通常是用来存放系统日志、脱机文件和临时的垫子文件等等,不建议单独划分分区
  • user 目录 用来存放默认的应用软件和一些常用的应用程序命令
  • tmp 临时文件存储目录,在系统重启后目录文件不会报保留

我们目前只需要划分这么几个就可以了,具体的目录作用后面会继续讲

完成配置后点击 Done,选择同意 对磁盘进行分区格式化操作,到此为止,磁盘配置完成

配置网络

点击网络,进入配置

默认有几块网卡 左侧就会显示几块

点击右侧的 OFF 会自动通过 VMware 的 自带 DHCP 功能获取 IP,如果你不希望默认就获取,可以点击配置

切换到 IPV4

选择Manual

然后添加,输入 IP 子网 网关和 DNS 保存,填写子网为24 相当于填写255.255.255.0, 此外,建议默认就把 DNS 配置为公共的 DNS 比如114.114.114.114 否则后面安装软件包会出现无法解析域名的情况。

配置完返回,然后点击继续安装,这个时候要求你创建用户和设置 Root 密码

点击 Root 密码设置,填写2次密码后即可,用户默认就不在这里创建了,密码过于简单,会有提示 直接忽略即可

安装过程

安装完成后 重新引导系统开机即可

异常解决

到这一步如果说你的镜像文件有问题,会出现报错导致系统安装退出,如果我们要重新安装,需要在虚拟机开启的时候设置下启动顺序

右键选择对应的虚拟机–电源–打开时启动固件,进入虚拟机的 BIOS 程序,通常这里面,我们可以把软件关闭

默认这里是显示1.44M的软件,什么年代了 还有这设置

切换到 Boot,选择 DVD,然后按+号,把光盘启动放在第一项,如图所示,按F10 保存,这个时候设备会重启在此进入磁盘的安装界面,重新安装,如果不行,重新下载镜像文件试试。

登陆系统

第一次安装完毕,会有一个简单的设置引导

设置LICENING

勾选即可

检查第二项网络 是否获取到 IP

进入欢迎界面

后面的都是直接下一步,或者跳过,到下面这个界面,输入用户名,创建一个普通用户

比如我这里创建一个 linuxer 的用户

然后设置密码

然后就可以进入桌面啦

进入后会弹出一个欢迎界面,可以忽略

第一个命令

图形化界面的使用,本篇不会过多讲解,主要是讲如何通过命令行界面管理系统,我们在桌面右键打开菜单,选择打开终端

就会弹出一个终端界面

那么我们就开始 linux 的学习吧,首先,我们输入第一个命令username 看看有什么反应吧!

我们可以看到输入 username 显示了 Linux。输入了 username -a 则显示很长的一串

[root@adsl-172-10-100-130 ~]# uname
Linux
[root@adsl-172-10-100-130 ~]# uname -a
Linux adsl-172-10-100-130.dsl.hstntx.sbcglobal.net 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

我们来看下中括号里面的内容是什么,[root@adsl-172-10-100-130 ~]root是当前登录的用户的用户名称;用@连接后面是主机名adsl-172-10-100-130~ 表示当前所在的目录位置是 root用户的家目录,需要注意的是root用户的家目录在根目录下的/root 目录下,而其他普通用户的家目录默认都在/home目录下;[]外面的#表示当前的用户类型是超级用户,普通用户则显示$;然后光标可以输入的地方才是输入Linux 命令的地方。

[root@adsl-172-10-100-130 ~]# uname -a
Linux adsl-172-10-100-130.dsl.hstntx.sbcglobal.net 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

我们上面输入 uname 显示的内容很短,而加了一个-a 则显示很长的内容,通常每一个命令都会有非常丰富的参数,命令的格式通常是

command [- options 1 options 2 ……]

一个命令可以加多个参数,比如我们还可以在 uname -ar 来查看

[root@adsl-172-10-100-130 ~]# uname -ar
Linux adsl-172-10-100-130.dsl.hstntx.sbcglobal.net 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux    

Linux adsl-172-10-100-130.dsl.hstntx.sbcglobal.net 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux的含义,这句话的意思是说当前的系统是Linux 系统;adsl-172-10-100-130.dsl.hstntx.sbcglobal.net是当前系统的主机名;3.10.0-514.el7.x86_64 是当前 Linux 的内核版本信息和架构信息,其中3.10.0-514意义非常丰富,稍后再说,.el7.x86_64 表示当前是rel 也就是红帽7的系统 X86_64 表示当前系统是一个64位的操作系统。#1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 后面则表示该系统安装的时间,其中GNU/Linux中的 GNU 是”Gnu’s Not Unix”的缩写,表示是一个类UNIX的操作系统。SMP 表示内核支持多核多处理器

我们所看到的图形化界面的操作系统,其实是由一堆的应用程序+Linux内核构成的。上面我们看到的3.10.0-514是 Linux 内核的版本号,从林纳斯先生从1.0版的内核到现在4.11.7,linux 内核的官网是www.kernel.org

Linux 的内核分为稳定版本和不稳定版本,通常版本号的格式是

a.bb.cc 

其中,a 是主版本号,取数字0-9之间的数,目前是4最大 bb 是次版本号,取值为00-99之间,其中,如果次版本号是偶数,则表示内核是稳定的,若为奇数,则表示为开发版 cc 表示修订版本号,通常每修复一次 bug,修订版本号就会增加一次,那么我们在回过头来看下3.10.0-514 则表示,目前内核主版本号是310是偶数表示是一个稳定的版本,514表示一共修订了514次。
前面我们说过,操作系统有个 boot 分区,是专门用来存储内核文件和系统引导程序的,当计算机开机的时候,你会看到有这个界面,在这里我们可以选择从哪个版本的内核启动操作系统。一般来说,最新的内核会排在第一位。

执行错误的命令

当我们执行命令出错了,shell 会给出提示,比如下面,提示你找不到 usename 这个命令

[root@server opt]# usename
-bash: usename: command not found

登陆和退出操作系统

1.计算机开机启动后,会进入一个登陆界面,如图所示,该界面可以像 Windows 一样选择对应的普通用户然后输入密码进行登陆。

而如果要切换到 root 用户,是不在这个列表中的,需要点击Not listed,然后输入用户名 root 和 root 的密码进行登陆,一般我们强烈不建议使用 root 直接登陆,因为 root 用户的权限非常大,一不小心就可能删错文件导致系统崩溃。

2.关机注销重启

在桌面如图所示区域你可以点击关闭按钮

会弹出一个对话框要求你确认操作,是重启、还是关机

而要切换用户,可以点击如图所示的位置选择 logout

但是,通常情况下,我们不会通过图形化界面去进行上述操作,因为使用 linux 最大的优势就是使用命令

切换用户 su

打开终端,我们输入su - 如图所示,当你输入错密码,界面会给出错误提示,而输入正确的命令,则不会有任何错误输出在屏幕

su 命令是用来进行用户与用户直接的切换操作,比如我们要从 linuxer 用户切换到 root 用户,我们可以输入

[linuxer@adsl-172-10-100-130 ~]$ su
Password:
[root@adsl-172-10-100-130 linuxer]#

但是 su 命令 带参数和不带参数是有区别的,主要的区别是切换用户后,所在的目录路径会有变化,比如我们上面直接输入 su,后面不带任何参数和选项,是直接切换到 root 用户,并且也仅限于切到 root 用户,我们输入 pwd 查看当前所在的路径是在哪里,可以看到当我们登陆到 root 用户,他的路径还是在 linuxer 的家目录下。

[root@adsl-172-10-100-130 linuxer]# pwd
/home/linuxer

而我们在继续看下面的,使用了 su - 会发现在切换之前,我们是在 linuxer 的家目录,而切换之后,查看目录则是在/root目录下了。

[linuxer@adsl-172-10-100-130 ~]$ pwd
/home/linuxer
[linuxer@adsl-172-10-100-130 ~]$ su -
Password:
Last login: Mon Jun 26 09:28:52 CST 2017 on pts/1
[root@adsl-172-10-100-130 ~]# pwd
/root
[root@adsl-172-10-100-130 ~]#

重启

重启关机等操作需要 root 权限执行,普通用户无法执行

重启使用reboot

[root@adsl-172-10-100-130 ~]# reboot

关机

[root@adsl-172-10-100-130 ~]# shutdown

获取帮助

学习 linux 不能靠死记硬背,linux 的命令不下于几万个,但是常用的也就几百个,一个命令的参数和说明非常多,用A4纸打印,估计一个命令都要几十页,很多时候,我们是记不住 linux 的各种参数的,那怎么办?遇到某个参数忘记了,要怎么解决?其实不用担心,linux 操作系统自带了一些帮助文档供我们查阅

help

当我们想关机,而不是立即关机,是希望等5分钟后关机,那么我们不知道如何设定5分钟后关机,我们可以看看 shutdown 命令的帮助文档呀,输入shutdown –help 就给出了这个命令的一些常用选项和解释,比如-r 参数是重启的,-h 是关机的

[root@adsl-172-10-100-130 ~]# shutdown --help
shutdown [OPTIONS...] [TIME] [WALL...]

Shut down the system.

     --help      Show this help
  -H --halt      Halt the machine
  -P --poweroff  Power-off the machine
  -r --reboot    Reboot the machine
  -h             Equivalent to --poweroff, overridden by --halt
  -k             Don't halt/power-off/reboot, just send warnings
     --no-wall   Don't send wall message before halt/power-off/reboot
  -c             Cancel a pending shutdown

比如当前的时间是9点49,我希望系统9点50关机,那么我们可以使用-h 参数指定关机的具体时间,这样也给其他登陆的用户一个缓冲时间,否则其他用户在使用的时候可能会存在没有保存资料掉电丢失的情况。当执行完毕后,系统会给出友好的提示信息。不过一般在企业生产环境中,强烈建议关机时间设定的稍微长些,给其他用户足够的时间保存文件。

[root@adsl-172-10-100-130 ~]# shutdown -h 9:50
Shutdown scheduled for Mon 2017-06-26 09:50:00 CST, use 'shutdown -c' to cancel.
[root@adsl-172-10-100-130 ~]#
Broadcast message from root@adsl-172-10-100-130.dsl.hstntx.sbcglobal.net (Mon 2017-06-26 09:49:37 CST):

The system is going down for power-off at Mon 2017-06-26 09:50:00 CST!      

man

我们还可以借助 man 手册查看命令帮助文档,这个比 help 更详细,但是通常都是英文的,所以要求你的英文水平不能太差。你可以按 q 键退出,看上下键对页面进行上下移动查看

[root@adsl-172-10-100-130 ~]# man shutdown

通常这些文档都存放在/usr/share/doc/

远程连接

通常情况下服务器都是安装完操作系统托管在 IDC 机房,我们没有办法直接接触硬件设备,IDC机房又称为数据中心,里面专门存放服务器和网络设备,声音嘈杂,并且由于设备多,热量大,所以一般机房都需要专业的制冷设备对热量进行疏导,特别的冷。而且机房设备多导致辐射特别大,你一定不会喜欢长时间待在里面工作的。

数据中心由机柜、网络设备(出口路由器、核心路由器或交换机、接入层交换机等)、服务器组成。服务器通过网线连接接入交换机,接入交换机一般到达汇聚层,然后到核心层,这需要有 CCNP 的相关知识。总之机房的活可不轻松,初级运维都是搬服务器的。很苦逼的,工资低,所以你一定不希望做这么初级的工作,对吧。那就要努力学更深的技术才不至于沦落到去机房搬服务器哦,否则找女朋友都困难。
不过也不是绝对的, Google 的数据中心就比较高大上了

360度旋转观看,需要科学上网

现在云计算特别火,比如阿里云 亚马逊的 AWS,一台1核1g 配置的服务器一年也花不了多少钱,有闲钱的话不如入手一台,可以自己搭建博客写写文章也是一种学习的手段。并且阿亚马逊 谷歌都提供一年免费试用,具体你可以搜我博客历史文章,关键词谷歌、AWS 查看。

回归正题,平时对操作系统的管理都是通过远程连接的方式进行,所以,我们应该要学会如何远程连接,通常所有的 linux 发行版都是使用SSH服务来提供安全的加密,SSH 是一种加密的安全的远程数据传输协议,在以前,一般都是要Telnet协议连接一些设备,比如交换机路由器,但是由于Telnet协议是明文传输,非常不安全。所以现在不论任何设备都建议开启 SSH 服务进行远程连接。Linux 操作系统的 ssh 服务是通过openssh来提供的,通常所有发行版都会默认提供这一服务。他的加密是使用 RSA 算法进行非对称加密,要想破解,基本是不可能,除非你私钥和公钥泄露了。

要进行远程连接需要开启 SSH 服务的端口,其端口号默认是22,我们使用

ssh username@ip [-p port] 的形式进行连接

使用 linux 或 uninx 连接

ssh root@172.10.100.100

因为端口默认是22 所以不需要填写也可以

$ ssh root@192.168.1.182
The authenticity of host '192.168.1.182 (192.168.1.182)' can't be established.
ECDSA key fingerprint is 15:75:df:a9:1e:fa:6c:c5:fd:a8:6b:e1:fb:47:46:b1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.182' (ECDSA) to the list of known hosts.
root@192.168.1.182's password:
Last login: Mon Jun 26 10:59:18 2017 from 192.168.1.155
[root@adsl-172-10-100-130 ~]#

以上是在 linux 和 linux 系统之间进行远程连接可以直接通过命令行进行,但是 Windows 默认是没有的,所以需要安装 ssh 客户端,这里推荐三种工具

  • putty
  • xshell
  • securecrt

putty 较为简单,但是是一个免费的工具,初期学习我们使用它足够了。

使用 putty

官网下载

点击此处下载对应 Windows 架构的 zip 压缩包,因为 zip 压缩包包含了其所有的软件包括 putty 本身,putty 不仅仅是提供远程连接,还提供远程密钥生成、远程文件传输等等工具。

解压得到如下文件,找到 putty.exe,双击打开

然后按照如图所示

填写完毕后双击 session 中保存的名称,打开SSH 连接,此时如果连接成功会弹出对话框,点击

然后输入用户名和密码登陆

此时就连接成功了。默认字体比较小,我们点击菜单栏邮件选择Setting

然后在 Windows-Appearance 中找到 font 设置,调整字体大小。

以上只是简单的将下如何连接 ssh,后面会详细介绍ssh 这个服务

Linux 常用文件目录管理命令

日常使用 linux 我们需要查看文件,创建目录,修改文件名,移动复制这些 Windows 鼠标点点的操作,在linux 命令行下如何使用?想知道的话,就跟着我一些来吧!follow me

linux 的目录

位置用途
/usr安装的软件、共享的库,包括文件和静态只读程序数据。重要的子目录有: - /usr/bin: 用户命令。
/usr/sbin系统管理命令
/usr/local本地自定义软件
/etc特定于此系统的配置文件
/var特定于此系统的可变数据,在系统启动之间保持永久性。动态变化的文件(如数 据库、缓存目录、日志文件、打印机后台处理文档和网站内容)可以在/var下找到
/run自上一次系统启动以来的进程的运行时数据。这包括进程ID文件和锁定文件,等 等。此目录中的内容在重启时重新创建。(此目录整合了旧版Red Hat Enterprise Linux中的/var/run和/var/lock)。
/home普通用户存储个人数据和配置文件的主目录。
/root管理超级用户root的主目录
/tmp共临时文件使用的全局科协空间。10天内未访问、未更改或未修改的文件将自动 从该目录中删除。还有一个临时目录/var/tmp,该目录中的文件如果在30天内未 曾访问、更改或修改过,将被自动删除。
/boot开始启动过程所需的文件
/dev包含特殊的设备文件,共系统用于访问硬件

在Red Hat Enterprise Linux 7中,/ 中的四个较旧的目录现在与它们在 /usr中对应的目录拥有完全相同的内容:

  • /bin和/usr/bin。
  • /sbin和/usr/bin。
  • /lib和/usr/lib。
  • /lib64和/usr/lib64

在Red Hat Enterprise Linux的较早版本中,这些是不同的目录,包含 几组不同的文件。在RHEL 7 中的目录是/usr中对应的符号链接。

##查看目录

linux 中查看目录的命令是 ls,常用方法有

[root@adsl-172-10-100-130 ~]# pwd
/root
[root@adsl-172-10-100-130 ~]# ls #直接 ls 查看当前目录下的文件
anaconda-ks.cfg  initial-setup-ks.cfg

你也可以查看帮助文档

[root@adsl-172-10-100-130 ~]# ls --help

通常我们常用的选项有

[root@adsl-172-10-100-130 ~]# ls -l #-l 参数可以查看详细信息,从左到右分别可以看到文文件的权限 所有者 所属组 文件大小 创建时间 以及文件名
total 8
-rw-------. 1 root root 1893 Jun 25 18:10 anaconda-ks.cfg
-rw-r--r--. 1 root root 1921 Jun 25 18:14 initial-setup-ks.cfg
[root@adsl-172-10-100-130 ~]# ll #ll 等同于 ls -l 这是一个别名,后面会讲
total 8
-rw-------. 1 root root 1893 Jun 25 18:10 anaconda-ks.cfg
-rw-r--r--. 1 root root 1921 Jun 25 18:14 initial-setup-ks.cfg
[root@adsl-172-10-100-130 ~]# ls -al # 加上-a 参数可以查看隐藏文件隐藏 文件以.开头
total 32
dr-xr-x---.  6 root root  217 Jun 26 12:24 . 
dr-xr-xr-x. 17 root root  233 Jun 25 18:10 ..
-rw-------.  1 root root 1893 Jun 25 18:10 anaconda-ks.cfg
-rw-------.  1 root root  143 Jun 26 13:23 .bash_history
-rw-r--r--.  1 root root   18 Dec 29  2013 .bash_logout
-rw-r--r--.  1 root root  176 Dec 29  2013 .bash_profile
-rw-r--r--.  1 root root  176 Dec 29  2013 .bashrc
drwx------.  4 root root   31 Jun 25 18:25 .cache
drwx------.  4 root root   30 Jun 25 18:25 .config
-rw-r--r--.  1 root root  100 Dec 29  2013 .cshrc
drwx------.  3 root root   25 Jun 25 18:12 .dbus
-rw-r--r--.  1 root root 1921 Jun 25 18:14 initial-setup-ks.cfg
drwx------.  2 root root   38 Jun 26 12:24 .ssh
-rw-r--r--.  1 root root  129 Dec 29  2013 .tcshrc

此外加上-h 参数还可以更人性化显示文件的大小

-rw-r--r--@   1 wenjun  staff   711B  6 17 13:02 404.html
-rw-r--r--    1 wenjun  staff   2.6K  6 25 10:58 _config.yml
-rw-r--r--    1 wenjun  staff   2.8M  6 26 16:49 db.json
-rw-r--r--    1 wenjun  staff   1.2M  6 18 07:50 debug.log
drwxr-xr-x  643 wenjun  staff    21K  6 23 14:43 node_modules
-rw-r--r--    1 wenjun  staff   181K  6 23 14:43 package-lock.json
-rw-r--r--    1 wenjun  staff   1.0K  6 23 14:43 package.json
drwxr-xr-x   27 wenjun  staff   918B  6 26 16:41 public
drwxr-xr-x    5 wenjun  staff   170B  6 16 22:32 scaffolds
drwxr-xr-x   17 wenjun  staff   578B  6 25 19:20 source
drwxr-xr-x    5 wenjun  staff   170B  6 18 12:05 themes

-d 参数可以查看目录的信息

[root@server ~]# ls -ld /tmp/
drwxrwxrwt. 9 root root 253 Jun 26 21:36 /tmp/

创建文件

Linux 操作系统 一切皆文件,下面我们就来看看如何创建文件吧

1.创建空文件,我们可以使用 touch 命令

[root@adsl-172-10-100-130 ~]# pwd
/root
[root@adsl-172-10-100-130 ~]# touch .aa #创建一个空的隐藏文件 aa
[root@adsl-172-10-100-130 ~]# ls #直接 ls 查看发现没有这个文件
anaconda-ks.cfg  initial-setup-ks.cfg
[root@adsl-172-10-100-130 ~]# ls -a #加上-a 参数查看
.  ..  .aa  anaconda-ks.cfg  .bash_history  .bash_logout  .bash_profile  .bashrc  .cache  .config  .cshrc  .dbus  initial-setup-ks.cfg  .ssh  .tcshrc

touch 除了创建空文件还可以将已存在的文件的修改时间进行更新

 [root@adsl-172-10-100-130 ~]# ll 
total 8
-rw-------. 1 root root 1893 Jun 25 18:10 anaconda-ks.cfg
-rw-r--r--. 1 root root 1921 Jun 25 18:14 initial-setup-ks.cfg
[root@adsl-172-10-100-130 ~]# touch  anaconda-ks.cfg # 查看上面的anaconda-ks.cfg 文件的创建时间然后与执行后对比,查看变化
[root@adsl-172-10-100-130 ~]# ll
total 8
-rw-------. 1 root root 1893 Jun 26 14:06 anaconda-ks.cfg
-rw-r--r--. 1 root root 1921 Jun 25 18:14 initial-setup-ks.cfg

. 和 ..的含义

绝对路径和相对路径

文件或目录的路径指定其唯一的文件系统位置。跟随文件路径会遍历一个或多个制定好的子目录,用正斜杠(/)分隔,直到 到达目标位置。与其他文件类型相同。标准的文件行为定义也 适用于目录(也成为文件夹)。

1.cd 命令 cd 命令是用来在系统各个目录之间切换的

[root@adsl-172-10-100-130 ~]# cd / # 切换到根目录
[root@adsl-172-10-100-130 /]# pwd #查看是否在根目录
/
[root@adsl-172-10-100-130 /]# cd /usr/local/ #进入到/usr/local/
[root@adsl-172-10-100-130 local]# pwd
/usr/local
[root@adsl-172-10-100-130 local]# cd .. #..是表示当前目录的上一级目录,之前是在/usr/local/ 回到了上一级目录就是/usr/目录了。
[root@adsl-172-10-100-130 usr]# pwd
/usr
[root@adsl-172-10-100-130 usr]# cd . # .的意思是表示当前目录
[root@adsl-172-10-100-130 usr]# ls
bin  etc  games  include  lib  lib64  libexec  local  sbin  share  src  tmp
[root@adsl-172-10-100-130 usr]# pwd
/usr
[root@adsl-172-10-100-130 usr]# cd ~ #回到当前用户的家目录
[root@adsl-172-10-100-130 ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg
[root@adsl-172-10-100-130 ~]# pwd
/root
[root@adsl-172-10-100-130 ~]# cd - #回到上上一次进入的目录
/usr
[root@adsl-172-10-100-130 usr]# pwd
/usr

创建目录

1.创建目录使用 mkdir 命令

[root@adsl-172-10-100-130 ~]# mkdir test
[root@adsl-172-10-100-130 ~]# ls
test    

查看文件内容

1.cat 查看一个文件的内容,通常是由 cat

[root@adsl-172-10-100-130 ~]# cat anaconda-ks.cfg
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
cdrom
# Use graphical install
graphical
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8

# Network information
network  --bootproto=dhcp --device=ens33 --ipv6=auto --no-activate
network  --hostname=localhost.localdomain

# Root password
rootpw --iscrypted $6$tcQCF0jSDornrvgq$plTnAs108cBzX9wl5nv35IEpk8Ugb3zi1juy1sPVTAimDmdRv47T2JCQhqob5vyKLtnx3gORmO2gv/4GDEkmu.

……

但是对于较大文件我们使用 cat 会把所有文件全部列读取输出,我们希望自定义翻页查看可以使用管道符加 more 命令来查看

此外,cat 有个缺点,就是不能往回看,那么这个时候就需要使用 less,less 也是可以查看文件的,但是 less 可以按上下键对文本内容进行上下翻页查看

[root@adsl-172-10-100-130 ~]# less anaconda-ks.cfg

管道符

管道命令操作符是:”|”,它仅能处理经由前面一个指令传出的正确输出信息,也就是标准输出的信息,对于标准错误信息没有直接处理能力。然后,传递给下一个命令,作为标准的输入标准输出.

[root@adsl-172-10-100-130 ~]# cat anaconda-ks.cfg | more

查看左下角会有一个 more。表示还有内容没有读取完,可以按回车键继续查看最后一行下没有显示的一行内容,如果按空格键则显示下一页。

啥是标准输入,标准输入就是你的键盘,标准输出就是显示器。而标准错误是指你执行一个命令报错了,那么这个信息就不会被输出,比如下面的

[root@adsl-172-10-100-130 ~]# sl 输出错了命令
bash: sl: command not found...
Similar command is: 'ls'
[root@adsl-172-10-100-130 ~]# sl | cat anaconda-ks.cfg #输入错误的命令没有打印 而是直接执行了后面的 cat 命令
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
cdrom
# Use graphical install
graphical
# Run the Setup Agent on first boot

head 和 tail

head 用来查看一个文件的最开始 n 行,通常-n 参数指定输出的行数,而 tail 是查看末尾 n 行

[root@server home]# cat /etc/passwd | head -n 1
root:x:0:0:root:/root:/bin/bash
[root@server home]# cat /etc/passwd | tail -n 1
user1:x:1000:1000::/home/user1:/bin/bash

此外 tail 常用的一个参数就是-f 用来实时的打印日志信息

$tail -f filename

重定向

命令说明
command > file将输出重定向到 file。
command < file将输入重定向到 file。
command >> file将输出以追加的方式重定向到 file。
n > file将文件描述符为 n 的文件重定向到 file。
n >> file将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m将输出文件 m 和 n 合并。
n <& m将输入文件 m 和 n 合并。
<< tag将开始标记 tag 和结束标记 tag 之间的内容作为输入。

输出重定向

1.”>>”可以将文件追加到文件的末尾,例如

[root@adsl-172-10-100-130 test]# echo "aaa" >> test1file
[root@adsl-172-10-100-130 test]# echo "bbb" >> test1file
[root@adsl-172-10-100-130 test]# cat test1file
aaa
bbb

2.”>” 会清空文件内容后添加

[root@adsl-172-10-100-130 test]# cat test1file
aaa
bbb
[root@adsl-172-10-100-130 test]# echo "cccc" > test1file
[root@adsl-172-10-100-130 test]# cat test1file
cccc

输入重定向

[root@adsl-172-10-100-130 test]# cat < users
linuxer  :0           2017-06-26 10:57 (:0)
root     pts/0        2017-06-26 11:22 (192.168.1.155)
root     pts/1        2017-06-26 13:45 (192.168.1.155)
root     pts/2        2017-06-26 12:21 (192.168.1.155)

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

  • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
  • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
  • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
    默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。
    如果希望 stderr 重定向到 file,可以这样写:

    $ command 2 > file

如果希望 stderr 追加到 file 文件末尾,可以这样写:

$ command 2 >> file

文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。

编号通道名称描述默认连接用法
0Stin标准输入键盘仅读取
1Stdout标准输出终端仅写入
2Stderr标准错误终端仅写入
3+filename其他文件读取和/或写入

标准错误文件

$ command > file 2>&1

或者

$ command >> file 2>&1

例如

[root@adsl-172-10-100-130 test]# sl
bash: sl: command not found...
Similar command is: 'ls'
[root@adsl-172-10-100-130 test]# sl > file 2>&1
[root@adsl-172-10-100-130 test]# cat file
bash: sl: command not found...
Similar command is: 'ls'

特殊重定向 Here Document

Here Document 是在Linux Shell 中的一种特殊的重定向方式,它的基本的形式如下

cmd << delimiter
  Here Document Content
delimiter

它的作用就是将两个 delimiter 之间的内容(Here Document Content 部分) 传递给cmd 作为输入参数。
比如在终端中输入cat << EOF ,系统会提示继续进行输入,输入多行信息再输入EOF,中间输入的信息将会显示在屏幕上。如下:

[root@server opt]# cat world << EOF
> 我现在输入一段文件
> 末尾回车换行
> 按 EOF 结束
> EOF

注: >这个符号是终端产生的提示输入信息的标识符

这里要注意几点

  • EOF 只是一个标识而已,可以替换成任意的合法字符
  • 作为结尾的delimiter一定要顶格写,前面不能有任何字符
  • 作为结尾的delimiter后面也不能有任何的字符(包括空格)
  • 作为起始的delimiter前后的空格会被省略掉

history

1.查看历史命令

history 命令用来查看历史执行过的命令记录

root@ubuntu-2gb-sfo1-01:~# history
    1  sudo apt-get update && sudo apt-get dist-upgrade
    2  clear
    3  wget -c http://soft.vpser.net/lnmp/lnmp1.4.tar.gz
    4  tar zxvf lnmp1.4.tar.gz
    5  screen -S lnmp
    6  ifconfig
    7  clear
    8  history

2.重复执行已经执行过的历史命令,只需要输入!后面跟上命令的 编号即可

  root@ubuntu-2gb-sfo1-01:~# !6
ifconfig
eth0      Link encap:Ethernet  HWaddr 0a:d2:1c:96:32:74
          inet addr:45.55.10.18  Bcast:45.55.31.255  Mask:255.255.224.0
          inet6 addr: fe80::8d2:1cff:fe96:3274/64 Scope:Link
          inet6 addr: 2604:a880:1:20::30fc:6001/64 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:90519 errors:0 dropped:0 overruns:0 frame:0
          屯溪 packets:73424 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:308058870 (308.0 MB)  屯溪 bytes:14371634 (14.3 MB)

eth1      Link encap:Ethernet  HWaddr 1a:16:2d:e2:b4:51
          inet addr:10.134.32.118  Bcast:10.134.255.255  Mask:255.255.0.0
          inet6 addr: fe80::1816:2dff:fee2:b451/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:16 errors:0 dropped:0 overruns:0 frame:0
          屯溪 packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:936 (936.0 B)  屯溪 bytes:578 (578.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:160 errors:0 dropped:0 overruns:0 frame:0
          屯溪 packets:160 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:11840 (11.8 KB)  TX bytes:11840 (11.8 KB)      

3.清空

root@ubuntu-2gb-sfo1-01:~# history -c
root@ubuntu-2gb-sfo1-01:~# history
    1  history

4.历史命令通常是保存在当前用户的家目录下的 .bash_history中。

~# cat ~/.bash_history
sudo apt-get update && sudo apt-get dist-upgrade
clear
wget -c http://soft.vpser.net/lnmp/lnmp1.4.tar.gz
tar zxvf lnmp1.4.tar.gz
screen -S lnmp       

文件描述符

文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket。第一个打开的文件是0,第二个是1,依此类推。Unix操作系统通常给每个进程能打开的文件数量强加一个限制。更甚的是,unix通常有一个系统级的限制。在UNIX/Linux平台上,对于控制台(Console)的标准输入(0),标准输出(1),标准错误(2)输出也对应了三个文件描述符。

linux下最大文件描述符的限制有两个方面,一个是用户级的限制,另外一个则是系统级限制

用户级别限制

对于用户级的限制,通过以下命令可以查看linux 的文件描述符配置

# sysctl -a| grep -i fs.file-max
fs.file-max = 65535

# cat /proc/sys/fs/file-max
65535

如果希望修改的话,需要编辑

vim /etc/security/limits.conf
* hard nofile 65535
* soft nofile 65535

其中,soft 指的是当前系统生效的设置值,hard 表明系统中所能设定的最大值

系统级别限制

对于系统级的限制可通过ulimit -n 查看

# ulimit -n
65535

修改的话需要编辑

vim /proc/sys/fs/file-max
65535

但是这只是临时修改,如果需要永久生效,需要将配置参数写入/etc/sysctl.conf中

fs.file-max=400000

复制

linux 中复制文件的命令是 cp,用法如下

[root@adsl-172-10-100-130 test]# ls
file
[root@adsl-172-10-100-130 test]# cp file file1
[root@adsl-172-10-100-130 test]# ls
file  file1

参数:

  • -f, –强制复制
  • -i, –提示信息
  • -r, –复制目录

移动

移动的命令是 mv,通常用来将一个文件重命名或移动到其他目录

重命名

[root@adsl-172-10-100-130 test]# mv file file2
[root@adsl-172-10-100-130 test]# ls
file1  file2

移动

[root@adsl-172-10-100-130 test]# mv file2 /opt/
[root@adsl-172-10-100-130 test]# cd /opt/
[root@adsl-172-10-100-130 opt]# ls
file2  rh

删除

删除需要使用 rm 命令

1.默认情况下不加任何参数,删除一个文件都会弹出一个提示

[root@adsl-172-10-100-130 opt]# touch a
[root@adsl-172-10-100-130 opt]# rm a
rm: remove regular empty file ‘a’? y
[root@adsl-172-10-100-130 opt]#

如果希望不进行提醒

[root@adsl-172-10-100-130 opt]# ls
file2  rh
[root@adsl-172-10-100-130 opt]# rm -f file2  

删除目录的情况下,需要加上 -r 参数

 [root@adsl-172-10-100-130 opt]# rm -f rmfile/
rm: cannot remove ‘rmfile/’: Is a directory      
[root@adsl-172-10-100-130 opt]# rm -rf rmfile/
[root@adsl-172-10-100-130 opt]#

w和 who 命令

w 命令用来查看当前在线用户

[root@server ~]# w
 22:47:23 up  1:53,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    raspberrypi.lan  21:06    3.00s  1.16s  0.05s w

第一列:22:47:23 当前时间,GMT时间,需要加时区+8 等于10点47分23秒; up 表示在线;1:53表示在线时长;1 user 表示目前1个用户在线;后面的load average: 0.00, 0.01, 0.05 表示 CPU 5 10 15分钟的负载。
第二列开始分别表示 用户名 登陆的终端 从哪里登陆 登陆的时间、空闲时间、JCPU、PCPU、当前正在运行进程的命令行

[root@server ~]# who
root     pts/0        2017-06-26 21:06 (raspberrypi.lan)

who 和 w 类似 显示的信息较少

#Linux 时间

Linux 系统启动时候从硬件读取日志和时间,读取完后就不再与硬件相关了,在 Linux 中和时间相关的命令有

date

查看时间,属于系统时钟

root@ubuntu:/home/fwj# date
Fri Mar 17 17:24:18 CST 2017

格式符

#date

FORMAT controls the output.  Interpreted sequences are:

     %%     a literal %

     %a     locale's abbreviated weekday name (e.g., Sun)

     %A     locale's full weekday name (e.g., Sunday)

     %b     locale's abbreviated month name (e.g., Jan)

     %B     locale's full month name (e.g., January)

查看时间

root@ubuntu:/home/fwj# date +%F
2017-03-17

查看时间

root@ubuntu:/home/fwj# date +%T
17:24:31

格式化输出

root@ubuntu:/home/fwj# date +%Y #显示年
2017 
root@ubuntu:/home/fwj# date +%m #显示月
03 
root@ubuntu:/home/fwj# date +%d #显示日期
17
root@ubuntu:/home/fwj# date +%H #显示时
17
root@ubuntu:/home/fwj# date +%s #时间戳
1489742993
root@ubuntu:/home/fwj# date +%S #显示分
55

clock

可以用来查看硬件时钟

# clock
2017年03月17日 星期五 17时43分37秒  -0.563053 seconds

hwclock

# hwclock
2017年03月17日 星期五 17时44分07秒  -0.908614 seconds

参数:

-s hctosys 表示以硬件为准
-w systohc 表示与系统为准

cal

查看当月

# cal
      三月 2017
日 一 二 三 四 五 六
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

查到一年的

# cal 2017
                               2017

        一月                   二月                   三月
日 一 二 三 四 五 六   日 一 二 三 四 五 六   日 一 二 三 四 五 六
 1  2  3  4  5  6  7             1  2  3  4             1  2  3  4
 8  9 10 11 12 13 14    5  6  7  8  9 10 11    5  6  7  8  9 10 11
15 16 17 18 19 20 21   12 13 14 15 16 17 18   12 13 14 15 16 17 18
22 23 24 25 26 27 28   19 20 21 22 23 24 25   19 20 21 22 23 24 25
29 30 31               26 27 28               26 27 28 29 30 31

        四月                   五月                   六月
日 一 二 三 四 五 六   日 一 二 三 四 五 六   日 一 二 三 四 五 六
                   1       1  2  3  4  5  6                1  2  3
 2  3  4  5  6  7  8    7  8  9 10 11 12 13    4  5  6  7  8  9 10
 9 10 11 12 13 14 15   14 15 16 17 18 19 20   11 12 13 14 15 16 17
16 17 18 19 20 21 22   21 22 23 24 25 26 27   18 19 20 21 22 23 24
23 24 25 26 27 28 29   28 29 30 31            25 26 27 28 29 30
30
        七月                   八月                   九月
日 一 二 三 四 五 六   日 一 二 三 四 五 六   日 一 二 三 四 五 六
                   1          1  2  3  4  5                   1  2
 2  3  4  5  6  7  8    6  7  8  9 10 11 12    3  4  5  6  7  8  9
 9 10 11 12 13 14 15   13 14 15 16 17 18 19   10 11 12 13 14 15 16
16 17 18 19 20 21 22   20 21 22 23 24 25 26   17 18 19 20 21 22 23
23 24 25 26 27 28 29   27 28 29 30 31         24 25 26 27 28 29 30
30 31
        十月                  十一月                 十二月
日 一 二 三 四 五 六   日 一 二 三 四 五 六   日 一 二 三 四 五 六
 1  2  3  4  5  6  7             1  2  3  4                   1  2
 8  9 10 11 12 13 14    5  6  7  8  9 10 11    3  4  5  6  7  8  9
15 16 17 18 19 20 21   12 13 14 15 16 17 18   10 11 12 13 14 15 16
22 23 24 25 26 27 28   19 20 21 22 23 24 25   17 18 19 20 21 22 23
29 30 31               26 27 28 29 30         24 25 26 27 28 29 30
                                              31

Linux的常用压缩命令

gzip

[root@CTN-QD-247 ~]# ls
access.log  lnmp-install.log  upgrade_nginx20161230153452.log
[root@CTN-QD-247 ~]# gzip lnmp-install.log  ##压缩后会删除原文件
[root@CTN-QD-247 ~]# ls
access.log  lnmp-install.log.gz  upgrade_nginx20161230153452.log
[root@CTN-QD-247 ~]# gzip -d lnmp-install.log.gz ##解压缩,但是会删除压缩包
[root@CTN-QD-247 ~]# ls
access.log  lnmp-install.log  upgrade_nginx20161230153452.log

bzip2

用法同上

tar

解压

[root@node-lvs-master src]# tar -zxf nginx-1.11.8.tar.gz ## 不显示进度
[root@node-lvs-master src]# tar -zxvf nginx-1.11.8.tar.gz ## 显示进度
nginx-1.11.8/
nginx-1.11.8/auto/
nginx-1.11.8/conf/
nginx-1.11.8/contrib/
nginx-1.11.8/src/
nginx-1.11.8/configure
nginx-1.11.8/LICENSE
nginx-1.11.8/README
nginx-1.11.8/html/

参数:

z 打包后通过gzip压缩
f 指定打包后的文件名
j 通过bzip2进行压缩
-C 指定解压缩的路径
-c 创建压缩文件
-x 释放压缩文件
-t 列出打包文档的内容

压缩

[root@node-lvs-master src]# tar cvf nginx.tar.gz nginx-1.11.8/ ## 创建一个gz的压缩文件


[root@node-lvs-master src]# tar cjf nginx-1.11.8.tar.bz2 nginx-1.11.8/ ##创建一个bz2的压缩文件
[root@node-lvs-master src]# ls
debug  kernels  nginx-1.11.8  nginx-1.11.8.tar.bz2

查看压缩包内容,但不解压

[root@node-lvs-master src]# tar -tf nginx-1.11.8.tar.gz 

history

查看历史命令

[root@node-lvs-master src]# history 
    1  exit
    2  pwd
    3  exit

小贴士:使用!加history中的行号可以快速执行对应的命令,例如!2 就执行pwd命令

Linux 的用户管理

系统中的每个进程(运行程序)都作为一个特定用户运行。每个文件归一个特定用户所有。对文件和目录的访问受到用户的限制。与运行进程相关联的用户可确定该进程可访问的文件和目录。

前面我们已经讲过 su 的用法,如何切换用户

sudo

从根本上而言,Linux实施非常粗糙的权限模型:root可以执行任何操作, 其他用户无法执行任何操作(与系统相关)。前面讨论的常用解决方案 是允许标准用户利用su命令暂时“成为root”用户。这样做的缺点在于, 作为root 操作时会被授予root的所有特权(和责任)。用户不进可以重 新启动web服务器,还可以删除整个/etc目录。此外,需要以这种方式 获取超级用户特权的用户都必须知道root用户的密码。

例如

fangwenjun@aliyun:~$ sudo su
[sudo] password for fangwenjun:
root@aliyun:/home/fangwenjun#

创建用户

useradd 和 adduser 创建用户

1.创建用户使用 useradd 后面直接跟上需要创建的用户名,此操作会自动创建一个与用户名一致的目录在/home下,并且会自动创建与用户对应的组

[root@server ~]# useradd user1
[root@server ~]# cat /etc/passwd | tail -n 1 
user1:x:1000:1000::/home/user1:/bin/bash 

useradd username会为/etc/password中的所有字段设置 合理的默认值。默认情况下,useradd命令不设置任何有效的 密码,用户也必 须要等设定了密码后才能登录。
通常用户信息会写在以下几个文件

  • /etc/passwd,普通用户默认的 id 是从1000开始,以此类推。例如user1:x:1000:1000::/home/user1:/bin/bash 其格式从左到右
usernameUID到名称的一种映射,用户名
password保存密码的位置,现在保存在/etc/shadow 中
UID用户ID
GID主组ID
GECOS字段存储任意文本,用户注释
/home/dir用户的家目录
shell用户登入后使用的shell名称
[root@server home]# cat /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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:996:User for polkitd:/:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
libstoragemgmt:x:997:995:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
chrony:x:996:994::/var/lib/chrony:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
user1:x:1000:1000::/home/user1:/bin/bash

密码不保存在改文件中,通常密码是保存在另外一个文件/etc/shadow

  • 用户名
  • 加密的密码
  • 上次更改密码的日期(从1970-1-1开始)
  • 最短密码期限(按天计算,0 = 无最短期限)
  • 最长密码期限(按天计算)
  • 密码警告期限(按天计算,0 = 未指定警告)
  • 密码非活动期限(按天计算)
  • 账号到期时间(从1970-1-1开始)
  • 保留域
[root@server home]# cat /etc/shadow
root:$6$vfNMVOLXJggBrmRW$ytF/LeT9lZYjxNeL/c7bA2np0pifogKghm58lLoFeo4Di6SIDRrBaXn419v8LbagdWtiLtHpXwgnz3rUeqCr/.::0:99999:7:::
bin:*:17110:0:99999:7:::
daemon:*:17110:0:99999:7:::
adm:*:17110:0:99999:7:::
lp:*:17110:0:99999:7:::
sync:*:17110:0:99999:7:::
shutdown:*:17110:0:99999:7:::
halt:*:17110:0:99999:7:::
mail:*:17110:0:99999:7:::
operator:*:17110:0:99999:7:::
games:*:17110:0:99999:7:::
ftp:*:17110:0:99999:7:::
nobody:*:17110:0:99999:7:::
systemd-bus-proxy:!!:17320::::::
systemd-network:!!:17320::::::
dbus:!!:17320::::::
polkitd:!!:17320::::::
apache:!!:17320::::::
libstoragemgmt:!!:17320::::::
abrt:!!:17320::::::
rpc:!!:17320:0:99999:7:::
tss:!!:17320::::::
postfix:!!:17320::::::
sshd:!!:17320::::::
ntp:!!:17320::::::
chrony:!!:17320::::::
tcpdump:!!:17320::::::
rpcuser:!!:17342::::::
nfsnobody:!!:17342::::::
user1:!!:17343:0:99999:7:::

我们重点看 user1和 root,root 是设置了密码的所以root 用户名后面直接跟的就是加密后的密码信息,而 user1没有密码,则显示!!

root:$6$vfNMVOLXJggBrmRW$ytF/LeT9lZYjxNeL/c7bA2np0pifogKghm58lLoFeo4Di6SIDRrBaXn419v8LbagdWtiLtHpXwgnz3rUeqCr/.::0:99999:7:::
user1:!!:17343:0:99999:7:::

还有一个和用户相关的文件就是组文件,在/etc/group,格式是

  • 组名:默认和用户名一致
  • 密码:通常不设置
  • gid: 组 id,默认和用户一致
  • 附加组信息

组信息

[root@server home]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:
kmem:x:9:
wheel:x:10:
cdrom:x:11:
mail:x:12:postfix
man:x:15:
dialout:x:18:
floppy:x:19:
games:x:20:
tape:x:30:
video:x:39:
ftp:x:50:
lock:x:54:
audio:x:63:
nobody:x:99:
users:x:100:
utmp:x:22:
utempter:x:35:
ssh_keys:x:999:
input:x:998:
systemd-journal:x:190:
systemd-bus-proxy:x:997:
systemd-network:x:192:
dbus:x:81:
polkitd:x:996:
apache:x:48:
libstoragemgmt:x:995:
abrt:x:173:
rpc:x:32:
tss:x:59:
dip:x:40:
slocate:x:21:
postdrop:x:90:
postfix:x:89:
sshd:x:74:
ntp:x:38:
chrony:x:994:
stapusr:x:156:
stapsys:x:157:
stapdev:x:158:
tcpdump:x:72:
rpcuser:x:29:
nfsnobody:x:65534:
user1:x:1000:

useradd 和 adduser 在此外是有区别的,但是在centos7 中没有区别

[root@server home]# useradd --help
Usage: useradd [options] LOGIN
       useradd -D
       useradd -D [options]

Options:
  -b, --base-dir BASE_DIR       base directory for the home directory of the
                                new account
  -c, --comment COMMENT         GECOS field of the new account
  -d, --home-dir HOME_DIR       home directory of the new account
  -D, --defaults                print or change default useradd configuration
  -e, --expiredate EXPIRE_DATE  expiration date of the new account
  -f, --inactive INACTIVE       password inactivity period of the new account
  -g, --gid GROUP               name or ID of the primary group of the new
                                account
  -G, --groups GROUPS           list of supplementary groups of the new
                                account
  -h, --help                    display this help message and exit
  -k, --skel SKEL_DIR           use this alternative skeleton directory
  -K, --key KEY=VALUE           override /etc/login.defs defaults
  -l, --no-log-init             do not add the user to the lastlog and
                                faillog databases
  -m, --create-home             create the user's home directory
  -M, --no-create-home          do not create the user's home directory
  -N, --no-user-group           do not create a group with the same name as
                                the user
  -o, --non-unique              allow to create users with duplicate
                                (non-unique) UID
  -p, --password PASSWORD       encrypted password of the new account
  -r, --system                  create a system account
  -R, --root CHROOT_DIR         directory to chroot into
  -s, --shell SHELL             login shell of the new account
  -u, --uid UID                 user ID of the new account
  -U, --user-group              create a group with the same name as the user
  -Z, --selinux-user SEUSER     use a specific SEUSER for the SELinux user mapping    

创建一个用户 user2默认没有 shell,并且家目录在/home 下的 xiaomi 目录中

[root@server home]# useradd -d /home/xiaomi -s /sbin/nologin  user2     

设置密码

给用户设置密码,可以使用 passwd 命令

[root@server home]# passwd user1
Changing password for user user1.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

修改用户属性

usermod 主要是修改已经创建的用的相关信息,参数和 useradd 基本一样

[root@server home]# usermod --help
Usage: usermod [options] LOGIN

Options:
  -c, --comment COMMENT         new value of the GECOS field
  -d, --home HOME_DIR           new home directory for the user account
  -e, --expiredate EXPIRE_DATE  set account expiration date to EXPIRE_DATE
  -f, --inactive INACTIVE       set password inactive after expiration
                                to INACTIVE
  -g, --gid GROUP               force use GROUP as new primary group
  -G, --groups GROUPS           new list of supplementary GROUPS
  -a, --append                  append the user to the supplemental GROUPS
                                mentioned by the -G option without removing
                                him/her from other groups
  -h, --help                    display this help message and exit
  -l, --login NEW_LOGIN         new value of the login name
  -L, --lock                    lock the user account
  -m, --move-home               move contents of the home directory to the
                                new location (use only with -d)
  -o, --non-unique              allow using duplicate (non-unique) UID
  -p, --password PASSWORD       use encrypted password for the new password
  -R, --root CHROOT_DIR         directory to chroot into
  -s, --shell SHELL             new login shell for the user account
  -u, --uid UID                 new UID for the user account
  -U, --unlock                  unlock the user account
  -Z, --selinux-user SEUSER     new SELinux user mapping for the user account

删除用户

1.使用如下命令直接删除用户,但是其家目录还存在,如果需要删除,加上-r 参数

[root@server home]# userdel user1

创建组

1.创建组

[root@server home]# groupadd g1
[root@server home]# tail -n 1 /etc/group
g1:x:1002:

2.创建g1和 g2组,将用户user3加入g1组,并且将其附加组加入 g2,观察 passwd 文件和 group 文件

[root@server home]# useradd  -g g1 -G g2 useradd3
[root@server home]# tail -n 2 /etc/group
g1:x:1002:
g2:x:1003:useradd3     
[root@server home]# cat /etc/passwd|tail -n 1
useradd3:x:1002:1002::/home/useradd3:/bin/bash 

删除组

如果组内有用户不能删除

[root@server home]# groupdel g1
groupdel: cannot remove the primary group of user 'useradd3'

linux 文件权限管理

Linux 操作系统相比较于 windows 要安全很多,其最大的一个特点就是在于 Linux 的权限管理十分严谨,那么我们来一起学习下linux 的文件权限如何来管理吧

基础的权限

###查看权限

1.我们创建一个空的文件,查看其属性,其中 -rw-r–r–,从左往右一共有10位,第一位在当前显示的是-,表示该权限位为空,r 表示有读权限,w 表示有写权限,此外除第一位外后面9位,三位一组分别是所有这权限,所属组权限、其他人权限,那么我们可以得知,file1这个文件所有这有读写权限,所属组有读权限,其他人有读权限。第一位为空表示其是一个普通文件,j具体参考下面的文件类型,第二列表示文件个数,第三列是所有者权限,表示该文件是 root 用户的,第四列表示文件所属组也是 root,后面2项此前在介绍 ls 命令时有说过

[root@server ~]# touch file1
[root@server ~]# ll
total 0
-rw-r--r--. 1 root root 0 Jun 26 07:36 file1

通常权限是用8进制来表示,分别是124 即读权限为1 写权限为2 可执行权限为3

2.我们创建一个目录,观察其权限大小第一位是 d,d 就表示是目录

[root@server ~]# mkdir test1
[root@server ~]# ll
total 0
-rw-r--r--. 1 root root 0 Jun 26 07:36 file1
drwxr-xr-x. 2 root root 6 Jun 26 07:40 test1

文件类型:

  • -,普通文件
  • d,目录;字母d,是dirtectory(目录)的缩写.
  • l,符号链接。请注意,一个目录或者说一个文件夹是一个特殊文件,这个特殊文件存放的是其他文件和文件夹的相关信息.
  • b,块设备文件。
  • c,字符设备文件。

修改权限

通常修改文件权限有2种方法

chmod命令

1.以字母方式修改,我们先查看文件,现在该文件的前三位也就是所有者的权限是 rw,我们希望让其有可执行权限

[root@server ~]# ll
total 0
-rw-r--r--. 1 root root 0 Jun 26 07:36 file1

使用chmod u+x filename 赋予其可执行权限,u 代表是 user,g 代表是group,o 代表是 other

[root@server ~]# chmod u+x file1
[root@server ~]# ll
total 0
-rwxr--r--. 1 root root 0 Jun 26 07:36 file1

参考上述说明,我们希望修改组的权限为读写,则

 [root@server ~]# chmod g+w file1
[root@server ~]# ll
total 0
-rwxrw-r--. 1 root root 0 Jun 26 07:36 file1

不允许其他人有任何权限,+代表增加权限; -代表减小权限,我们可以看到默认其他人有读权限,那么我们减掉他的读权限,他就变成了 ---,此前说过,-表示该位无权限。

[root@server ~]# chmod o-r file1
[root@server ~]# ll
total 0
-rwxrw----. 1 root root 0 Jun 26 07:36 file1

我们要赋予其所有者 所属组和其他人都有可执行权限,可以这样写

[root@server opt]# chmod +x test.sh    

2.已8进制方式修改,前面说过,权限位可以用8进制来进行描述,那么,我们来看下,r=1;w=2;x=3,我们希望修改文件的所有者权限是可读可写可执行,而其他人和组都没有权限,则所有者权限为7,1+2+3这个算数应该是会的哦,那么其他人和组都没有就算— —,没有就是用数字0表示,所以是700;

[root@server ~]# touch file2
[root@server ~]# chmod 700 file2
[root@server ~]# ll file2
-rwx------. 1 root root 0 Jun 26 21:23 file2

那么希望用户,组,其他人都有读写执行权限,就是777

[root@server ~]# chmod 777 file2
[root@server ~]# ll file2
-rwxrwxrwx. 1 root root 0 Jun 26 21:23 file2

chown 命令

chown 命令是用来修改文件的用户和组信息,我们先来创建2个用户,test1和 test2

[root@server ~]# useradd test1
[root@server ~]# useradd test2

然后我们创建2个文件 file1 和 file2

[root@server ~]# ll
total 0
-rwxrw----. 1 root root 0 Jun 26 07:36 file1
-rwxrwxrwx. 1 root root 0 Jun 26 21:23 file2

现在file1的所有者是 root,我要修改其为 test1;所属组也是 root 我要修改其为 test2,那么应该

[root@server ~]# chown test1:test2 file1
[root@server ~]# ll
total 0
-rwxrw----. 1 test1 test2 0 Jun 26 07:36 file1

或,反正只希望修改所有者的权限,则是chown user:group filename

[root@server ~]# chown root:test2 file1
[root@server ~]# ll
total 0
-rwxrw----. 1 root test2 0 Jun 26 07:36 file1

chgrp 命令

如果只希望修改组的权限,可以使用 chgrp

[root@server ~]# chgrp test2 file1
[root@server ~]# ll
total 0
-rwxrw----. 1 root test2 0 Jun 26 07:36 file1    

特殊权限

在学习本篇之前,我们先来看看2个文件的权限,是不是发现有什么不对劲,先看 passwd 文件,他的所有者权限中多了个s 在看 tmp 目录,other 位是 t。唉,权限不应该是 rwx 吗?

[root@server ~]# ls -ld /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd
[root@server ~]# ls -ld /tmp/
drwxrwxrwt. 9 root root 253 Jun 26 21:36 /tmp/

那么我们接着往下学习吧

SUID

当一个文件上测拥有者 x 权限为上有 s 时候,比如我们上面看到的 passwd 文件,此时我们就称为 SET UID,简写 SUID,它对于一个文件有以下几个功能

  • SUID 权限仅对二进制可执行权限有效
  • 执行者对于该文件有 x 权限
  • s 权限仅在执行该文件的过程中有效
  • 执行者将具有该文件拥有者的权限

怎么理解呢?上面我们看到了 passwd 文件,他的所有者是 root, 在 root 用户下执行 passwd 可以成功修改密码

[root@server ~]# passwd test1
Changing password for user test1.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.

我们切换到 test1

[root@server ~]# su test1
[test1@server root]$ cd ~
[test1@server ~]$

修改密码

[test1@server ~]$ passwd
Changing password for user test1.
Changing password for test1.
(current) UNIX password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

而最终 passwd 这个命令的信息是要被写到/etc/passwd 文件的,而这个文件只有 root 权限才可以更改。既然只有 root 用户可以改,那么为什么 passwd 命令可以来修改呢?这个就是设置 suid 权限的厉害之处了。

[test1@server ~]$ ls -ld /etc/passwd
-rw-r--r--. 1 root root 1619 Jun 26 21:28 /etc/passwd

SGID

当s出现在目录或文件所属群的x权限上时,此时就称为SET GID简称SGID。

SGID对文件和目录分部有以下几个功能

1.SGID对目录

  • 使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录
  • 使用者在此目录下的群组将会变成该目录的群组
  • 若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同

2.SGID对文件

  • SGID 对二进制可执行文件有效
  • 程序执行者对于该文件来说,需具备 x 的权限
  • 执行者在执行的过程中将会获得该文件群组的支援(用于改文件群组的权限)

SBIT

当s出现在目录其他用户的x权限上时,此时就称为Sticky Bit简称SBIT

SBIT有以下限制和作用

  • 仅对目录有效,对文件无效
  • 当使用者在该目录下建立文件或目录时(有权限的情况下),仅自己与 root 才有权力删除新建的目录或文件

我们来看下创建2个目录,test1和 test2,分别赋予所以用户其读写执行权限,然后将 test2设置为有 sbit 权限

[root@server opt]# mkdir test1
[root@server opt]# mkdir test2
[root@server opt]# ll
total 0
drwxr-xr-x. 2 root root 6 Jun 26 22:15 test1
drwxr-xr-x. 2 root root 6 Jun 26 22:15 test2
[root@server opt]# chmod 777 *
[root@server opt]# chmod o+t test2/
[root@server opt]# ll
total 0
drwxrwxrwx. 2 root root 6 Jun 26 22:15 test1
drwxrwxrwt. 2 root root 6 Jun 26 22:15 test2    

切换到 test1用户 分别在2个目录创建一个文件

[root@server opt]# su test1
[test1@server opt]$ cd test1/
[test1@server test1]$ touch a
[test1@server test1]$ cd ..
[test1@server opt]$ cd test2/
[test1@server test2]$ touch b

切换到 test2用户,删除2个目录的文件,文件 a 和文件 b,观察可以看到没有设置 sbit 权限的目录test1内文件其他用户可以删除,而 test2不允许删除

[test2@server opt]$ cd test1/
[test2@server test1]$ ls
a
[test2@server test1]$ rm -rf a
[test2@server test1]$ ls
[test2@server test1]$ cd ..
[test2@server opt]$ ls
test1  test2
[test2@server opt]$ cd test2/
[test2@server test2]$ rm -rf b
rm: cannot remove ‘b’: Operation not permitted
[test2@server test2]$ ls
b
[test2@server test2]$

如何设置SUID SBIT SBIT

操作这些标志与操作文件权限的命令是一样的, 都是 chmod. 有两种方法来操作

符号类型改权限

  • chmod u+s testbin– 为testbin文件加上setuid标志.
  • chmod g+s testdir– 为testdir目录加上setgid标志
  • chmod o+t testdir– 为testdir目录加上sticky标志

数字类型改变权限

采用八进制方式. 对一般文件通过三组八进制数字来置标志, 如 666, 777, 644等. 如果设置这些特殊标志, 则在这组数字之外外加一组八进制数字. 如 4666, 2777等. 这一组八进制数字三位的意义如下:

abc

  • a - setuid位, 如果该位为1, 则表示设置setuid 4—
  • b - setgid位, 如果该位为1, 则表示设置setgid 2—
  • c - sticky位, 如果该位为1, 则表示设置sticky 1—

设置完这些标志后, 可以用 ls -l 来查看. 如果有这些标志, 则会在原来的执行标志位置上显示. 如:

  • rwsrw-r– 表示有setuid标志
  • rwxrwsrw- 表示有setgid标志
  • rwxrw-rwt 表示有sticky标志

那么原来的执行标志x到哪里去了呢? 系统是这样规定的, 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)

文件访问控制列表

上面讲了基本的权限和特殊权限,在实际的系统管理中,基础的权限设置过于单一,加入我们要设置多个不同组的用户对某一个组的文件具有读写权限,使用基本的权限是无法满足的,那么这个时候就需要使用 linux 的文件访问控制列表 acl 了。

ACL 可以按以下条件配置:

  • 每用户
  • 每组群
  • 通过有效权限屏蔽
  • 为不属于文件用户组群的用户配置

查看文件访问控制列表

1.getfacl

通常要查看一个文件的 acl 信息,我们可以使用 getfacal 命令查看,我们创建一个文件叫 acl,然后用 getfacal acl 去查看该文件的访问控制列表内容

[root@server opt]# mkdir acl
[root@server opt]# chmod 700 acl/
[root@server opt]# ll
total 0
drwx------. 2 root root 6 Jun 26 22:33 acl
[root@server opt]# getfacl acl/
# file: acl/ #文件名
# owner: root #所有者是root
# group: root #所属组是 root
user::rwx #用户对改文件或目录有 rwx 权限
group::---
other::---

设置文件访问控制列表

1.setfacl

setfacl 工具为文件和目录设置 ACL。使用 -m 来添加或修改文件或目录的 ACL:

规则()必须使用以下格式指定。同一条命令中可以指定多项规则,只要它们是用逗号分开即可。

  • u::为用户设置存取 ACL。用户名或 UID 必须被指定。用户可以是系统上的任何合法用户。

  • g::为组群设置存取 ACL。组群名称或 GID 必须被指定。组群可以是系统上的任何合法组群。

  • m:设置有效权限屏蔽。该屏蔽是组群所有者和所有用户和组群项目的权限的合集。

  • o:为文件的组群用户之外的用户设置存取 ACL。

空格被忽略。权限()必须是代表读、写、和执行的字符(r、w、x)的组合。

如果某文件或目录已经有了一个 ACL,而 setfacl 命令仍被使用了,额外的规则就会被添加到已存在的 ACL 中,或用来修改已存在的规则。

2.例子1,给 acl 目录设置 acl,允许test1用户对该目录有读写执行权限

root@server opt]# setfacl -m u:test1:rwx acl/
[root@server opt]# getfacl acl/
# file: acl/
# owner: root
# group: root
user::rwx
user:test1:rwx
group::---
mask::rwx
other::---

观察基本的权限,会发现末尾都了一个+号, 表示该目录或文件有 acl 权限。

3.例子2,给 acl 目录设置 acl 权限,允许 test2 组对文件有读写执行权限

[root@server opt]# setfacl -m g:test2:rwx acl/
[root@server opt]# ll
total 0
drwxrwx---+ 2 root root 6 Jun 26 22:33 acl
[root@server opt]# getfacl al
getfacl: al: No such file or directory
[root@server opt]# getfacl acl/
# file: acl/
# owner: root
# group: root
user::rwx
user:test1:rwx
group::---
group:test2:rwx
mask::rwx
other::---

##改变文件附加属性

chattr命令

Linux chattr命令用于改变文件属性。

这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式:

a:让文件或目录仅供附加用途。

b:不更新文件或目录的最后存取时间。

c:将文件或目录压缩后存放。

d:将文件或目录排除在倾倒操作之外。

i:不得任意更动文件或目录。

s:保密性删除文件或目录。

S:即时更新文件或目录。

u:预防以外删除。

语法chattr[-RV][-v<版本编号>][+/-/=<属性>][文件或目录…]参数

-R 递归处理,将指定目录下的所有文件及子目录一并处理。

-v<版本编号> 设置文件或目录版本。

-V 显示指令执行过程。

+<属性> 开启文件或目录的该项属性。

-<属性> 关闭文件或目录的该项属性。

=<属性> 指定文件或目录的该项属性。

实例

用chattr命令防止系统中某个关键文件被修改:

# chattr +i /opt/back.sh 

会显示如下属性

—-i——–/etc/resolv.conf

让某个文件只能往里面追加数据,但不能删除,适用于各种日志文件:

# chattr +a /opt/back.sh 

lsattr命令

功能:查看文件扩展属性

# lsattr back.sh 
----ia-------e- back.sh

Linux中的文件链接

Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。

##硬连接

硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

软连接

另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

umask

什么是 umask

umask 是和 chmod 配套的,总共分为4位,gid/uid,所属组,所有者,其他人权限;不过 umask 通常是用到最后3个,也就是不需要 gid 或 uid 位,默认情况下 umask 的值是022,可以通过 umask 命令查看

# umask
0022

此时你建立的文件默认权限是644(6=0,6=2,6=2),建立的目录的默认权限是755(7=0,7=2,7=2)它其实是为了控制默认权限,不要使默认的文件和目录具有全权而设的。比如我们创建一个文件和目录看看

创建文件和目录

[root@kvm-vritual-host ~]# touch aaa
[root@kvm-vritual-host ~]# mkdir bbb
[root@kvm-vritual-host ~]# ll
总用量 4
-rw-r--r-- 1 root root    0 3月  22 11:55 aaa
drwxr-xr-x 2 root root 4096 3月  22 11:55 bbb

回顾权限位
r 读权限 ==== 4
w 写权限 ==== 2
x 执行权限 ==== 1

权限三位一组,最前面的一位不算,所以上面的aa 文件就是rw-r–r–,那么 r+w=6,r=4,r=4 也就是644,所以文件的最大权限就是777,那么777-644=122,咦,不对啊。为什么是122 不是022?

那么,我们在看目录,bbb 这个目录drwxr-xr-x,去掉第一位 d,就是rwx r-x r-x,得到的是755对么,目录最大的权限是777,777-755=022,对上了,真是这样的吗?那前面的122是什么鬼?

重要提示:umask 只对普通用户的权限拥有控制,仔细看看上面的创建文件和目录是在哪个用户上创建的?

所以,root 用户上创建的是看不出来效果的,我们需要切换到普通用户去创建,然后对比下,自己算算看,是不是对上了。

[fangwenjun@kvm-vritual-host ~]$ touch aaa
[fangwenjun@kvm-vritual-host ~]$ touch bbb
[fangwenjun@kvm-vritual-host ~]$ ll
总用量 0
-rw-rw-r-- 1 fangwenjun fangwenjun 0 3月  22 11:59 aaa
-rw-rw-r-- 1 fangwenjun fangwenjun 0 3月  22 11:59 bbb

权限怎算,我们上面提到的那样进行相减的方式,其实是不规范的,我们看下面的

[root@vbird test]# umask 003
[root@vbird test]# touch test3
[root@vbird test]# mkdir test4
[root@vbird test]# ll
-rw-rw-r– 1 root root 0 Oct 22 00:03 test3
drwxrwxr– 2 root root 4096 Oct 22 00:03 test4/

test3=666-003=663,663的权限应该是-rw-rw-wx 才对,但是它得到的确是-rw-rw-r–,所以,我们尽量不要直接去减,我们可以这样算

(-rw-rw-rw-)-(——-wx)=rw-rw-r–

umask 的权限修改

1.修改配置文件

#vim /etc/bashrc
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
      umask 002
   else
      umask 022
   fi

2.直接 umask 003 这样的方式修改,重启后消失

[root@kvm-vritual-host fangwenjun]# umask 003
[root@kvm-vritual-host fangwenjun]# umask
0003

系统监控相关命令

查看 CPU 内存信息

1.硬件信息主要保存在/proc 目录中,比如我们要查看 cpu信息

[root@server ~]# cat /proc/cpuinfo
processor    : 0
vendor_id    : GenuineIntel
cpu family    : 6
model        : 60
model name    : Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz
stepping    : 3
microcode    : 0x1e
cpu MHz        : 3300.618
cache size    : 6144 KB
physical id    : 0
siblings    : 1
core id        : 0
cpu cores    : 1
apicid        : 0
initial apicid    : 0
fpu        : yes
fpu_exception    : yes
cpuid level    : 13
wp        : yes
flags        : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm ida arat epb pln pts dtherm fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid xsaveopt
bogomips    : 6602.00
clflush size    : 64
cache_alignment    : 64
address sizes    : 42 bits physical, 48 bits virtual
power management:

2.uptime,该命令和 w 命令显示信息类似,主要显示当前 CPU 的 5 10 15分钟的平均负载信息

[root@server ~]# uptime
 22:57:26 up  2:03,  1 user,  load average: 0.00, 0.01, 0.05

查看内存信息

1.查看内存信息

[root@server ~]# cat /proc/meminfo
MemTotal:         999920 kB
MemFree:          604028 kB
MemAvailable:     609824 kB
Buffers:            1004 kB
Cached:           128568 kB
SwapCached:            0 kB
Active:           181448 kB
Inactive:          85032 kB
Active(anon):     137272 kB
Inactive(anon):     6484 kB
Active(file):      44176 kB
Inactive(file):    78548 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        136940 kB
Mapped:            28148 kB
Shmem:              6848 kB
Slab:              60856 kB
SReclaimable:      21588 kB
SUnreclaim:        39268 kB
KernelStack:        4832 kB
PageTables:        11480 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     2597108 kB
Committed_AS:     571972 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      180756 kB
VmallocChunk:   34359310332 kB
HardwareCorrupted:     0 kB
AnonHugePages:     12288 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       67456 kB
DirectMap2M:      980992 kB
DirectMap1G:           0 kB

2.free 主要是用来查看内存使用信息,通常我们都是要-h 参数,更人性化的观察数据

[root@server ~]# free
              total        used        free      shared  buff/cache   available
Mem:         999920      205480      604012        6848      190428      609808
Swap:       2097148           0     2097148
[root@server ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           976M        200M        589M        6.7M        185M        595M
Swap:          2.0G          0B        2.0G

其第一行显示的是物理内存信息,第二行显示是交换分区信息
第二列显示总共的内存大小和交换分区大小
第三列显示已经使用的内存大小和交换分区大小,可以看到目前没有使用交换分区空间
第四列显示剩余的内存大小和交换分区大小
第五列显示多个进程共享的内存大小
第六列显示 buff 和 cacche 信息,代表磁盘缓存使用状态,

对于应用程序来说,buffers/cached占有的内存是可用的,因为buffers/cached是为了提高文件读取的性能,当应用程序需要用到内存的时候,buffers/cached会很快地被回收,以供应用程序使用。

3.使用-s参数我们可以指定每3秒显示一次知道你退出终端,加上-c参数设置多少次退出。

$ free -s 3 -c 5
             total       used       free     shared    buffers     cached
Mem:       1018332     588736     429596        608     101768     192548
-/+ buffers/cache:     294420     723912
Swap:            0          0          0

             total       used       free     shared    buffers     cached
Mem:       1018332     588752     429580        608     101768     192548
-/+ buffers/cache:     294436     723896
Swap:            0          0          0

4.显示最高和最低的内存使用情况

$ free -l
             total       used       free     shared    buffers     cached
Mem:       1018332     590908     427424        608     101852     192596
Low:       1018332     590908     427424
High:            0          0          0
-/+ buffers/cache:     296460     721872
Swap:            0          0          0

linux的内存管理

在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然。这是Linux内存管理的一个优秀特性,在这方 面,区别于Windows的内存管理。主要特点是,无论物理内存有多大,Linux 都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能。而Windows是只在需要内存时, 才为应用程序分配内存,并不能充分利用大容量的内存空间。换句话说,每增加一些物理内存,Linux都将能充分利用起来,发挥了硬件投资带来的好处,而 Windows只将其做为摆设,即使增加8GB甚至更大。

Linux的这一特性,主要是利用空闲的物理内存,划分出一部份空间,做为cache、buffers ,以此提高数据访问性能。

页高速缓存(cache)是Linux内核实现的一种主要磁盘缓存。它主要用来减少对磁盘的I/O操作。具体地讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理 内存的访问。

磁盘高速缓存的价值在于两个方面:第一,访问磁盘的速度要远远低于访问内存的速度,因此,从内存访问数据比从磁盘访问速度更快。第二,数据一旦被访 问,就很有可能在短期内再次被访问到。

物理内存和虚拟内存

我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。

物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。

作为物理内存的扩展,linux会在物理内存不足时,使用交换分区的虚拟内存,更详细的说,就是内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。

Linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。

要深入了解linux内存运行机制,需要知道下面提到的几个方面:
Linux系统会不时的进行页面交换操作,以保持尽可能多的空闲物理内存,即使并没有什么事情需要内存,Linux也会交换出暂时不用的内存页面。这可以避免等待交换所需的时间。
Linux 进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存,linux内核根据”最近最经常使用“算法,仅仅将一些不经常使用的页面文件交换到虚拟 内存,有时我们会看到这么一个现象:linux物理内存还有很多,但是交换空间也使用了很多。其实,这并不奇怪,例如,一个占用很大内存的进程运行时,需 要耗费很多内存资源,此时就会有一些不常用页面文件被交换到虚拟内存中,但后来这个占用很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页面 文件并不会自动的交换进物理内存,除非有这个必要,那么此刻系统物理内存就会空闲很多,同时交换空间也在被使用,就出现了刚才所说的现象了。关于这点,不 用担心什么,只要知道是怎么一回事就可以了。
交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页 面,它们又会被马上交换出去,如此以来,虚拟内存中可能没有足够空间来存储这些交换页面,最终会导致linux出现假死机、服务异常等问题,linux虽 然可以在一段时间内自行恢复,但是恢复后的系统已经基本不可用了。
因此,合理规划和设计Linux内存的使用,是非常重要的.

buffers与cached的异同

在Linux 操作系统中,当应用程序需要读取文件中的数据时,操作系统先分配一些内存,将数据从磁盘读入到这些内存中,然后再将数据分发给应用程序;当需要往文件中写 数据时,操作系统先分配内存接收用户数据,然后再将数据从内存写到磁盘上。然而,如果有大量数据需要从磁盘读取到内存或者由内存写入磁盘时,系统的读写性 能就变得非常低下,因为无论是从磁盘读数据,还是写数据到磁盘,都是一个很消耗时间和资源的过程,在这种情况下,Linux引入了buffers和 cached机制。

buffers与cached都是内存操作,用来保存系统曾经打开过的文件以及文件属性信息,这样当操作系统需要读取某些文件时,会首先在buffers 与cached内存区查找,如果找到,直接读出传送给应用程序,如果没有找到需要数据,才从磁盘读取,这就是操作系统的缓存机制,通过缓存,大大提高了操 作系统的性能。但buffers与cached缓冲的内容却是不同的。

buffers是用来缓冲块设备做的,它只记录文件系统的元数据(metadata)以及 tracking in-flight pages,而cached是用来给文件做缓冲。更通俗一点说:buffers主要用来存放目录里面有什么内容,文件的属性以及权限等等。而cached直接用来记忆我们打开过的文件和程序。

查看进程占用内存 CPU等信息

1.top

top 命令可以实时的观察正在运行的每一个进程的资源使用率

TOP前五行统计信息

统计信息区前五行是系统整体的统计信息。
1.第一行是任务队列信息
同 uptime 命令的执行结果:

[root@localhost ~]# uptime
 13:22:30 up 8 min,  4 users,  load average: 0.14, 0.38, 0.25

其内容如下:

12:38:33当前时间
up 50days系统运行时间,格式为时:分
1 user当前登录用户数
load average: 0.06, 0.60, 0.48系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。

2.第二、三行为进程和CPU的信息

当有多个CPU时,这些内容可能会超过两行。内容如下:

Tasks: 29 total进程总数
1 running正在运行的进程数
28 sleeping睡眠的进程数
0 stopped停止的进程数
0 zombie僵尸进程数
Cpu(s): 0.3% us用户空间占用CPU百分比
1.0% sy内核空间占用CPU百分比
0.0% ni用户进程空间内改变过优先级的进程占用CPU百分比
98.7% id空闲CPU百分比
0.0% wa等待输入输出的CPU时间百分比
0.0% hi0.0% si

3.第四五行为内存信息。

内容如下:

Mem: 191272k total物理内存总量
173656k used使用的物理内存总量
17616k free空闲内存总量
22052k buffers用作内核缓存的内存量
Swap: 192772k total交换区总量
0k used使用的交换区总量
192772k free空闲交换区总量
123988k cached缓冲的交换区总量。 内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖, 该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入。

进程信息

列名含义
PID进程id
PPID父进程id
RUSERReal user name
UID进程所有者的用户id
USER进程所有者的用户名
GROUP进程所有者的组名
TTY启动进程的终端名。不是从终端启动的进程则显示为 ?
PR优先级
NInice值。负值表示高优先级,正值表示低优先级
P最后使用的CPU,仅在多CPU环境下有意义
%CPU上次更新到现在的CPU时间占用百分比
TIME进程使用的CPU时间总计,单位秒
TIME+进程使用的CPU时间总计,单位1/100秒
%MEM进程使用的物理内存百分比
VIRT进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
SWAP进程使用的虚拟内存中,被换出的大小,单位kb。
RES进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
CODE可执行代码占用的物理内存大小,单位kb
DATA可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
SHR共享内存大小,单位kb
nFLT页面错误次数
nDRT最后一次写入到现在,被修改过的页面数。
S进程状态。 D=不可中断的睡眠状态 R=运行S=睡眠 T=跟踪/停止 Z=僵尸进程
COMMAND命令名/命令行
WCHAN若该进程在睡眠,则显示睡眠中的系统函数名
Flags任务标志,参考 sched.h

vmstat

用法

vmstat [-a] [-n] [-S unit] [delay [ count]]
vmstat [-s] [-n] [-S unit]
vmstat [-m] [-n] [delay [ count]]
vmstat [-d] [-n] [delay [ count]]
vmstat [-p disk partition] [-n] [delay [ count]]
vmstat [-f]
vmstat [-V]

-a:显示活跃和非活跃内存
-f:显示从系统启动至今的fork数量 。
-m:显示slabinfo
-n:只在开始时显示一次各字段名称。
-s:显示内存相关统计信息及多种系统活动数量。
delay:刷新时间间隔。如果不指定,只显示一条结果。
count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
-d:显示磁盘相关统计信息。
-p:显示指定磁盘分区统计信息
-S:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
-V:显示vmstat版本信息。

示例

  1. 每3秒输出一次信息

    [root@server ~]# vmstat 3

2.每3秒输出一次,只输出2次

[root@server ~]# vmstat 3 2

字段说明

Procs(进程):

r: 运行队列中进程数量,这个值也可以判断是否需要增加CPU。(长期大于1)
b: 等待IO的进程数量

Memory(内存):
swpd: 使用虚拟内存大小

注意:如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。

free: 空闲物理内存大小
buff: 用作缓冲的内存大小
cache: 用作缓存的内存大小

注意:如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。

Swap:

si: 每秒从交换区写到内存的大小,由磁盘调入内存
so: 每秒写入交换区的内存大小,由内存调入磁盘

注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。

IO:(现在的Linux版本块的大小为1kb)
bi: 每秒读取的块数
bo: 每秒写入的块数

注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。

系统:

in: 每秒中断数,包括时钟中断。
cs: 每秒上下文切换数。

注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。

CPU(以百分比表示):

us: 用户进程执行时间百分比(user time)

注意: us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。

sy: 内核系统进程执行时间百分比(system time)

注意:sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。

wa: IO等待时间百分比

注意:wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。

id: 空闲时间百分比

进程管理

centos7 使用 systemd 管理进行,systemd 是父进程。

查看进程的命令

  • ps
  • pstree
  • top

ps

[root@localhost yum.repos.d]# ps
   PID TTY          TIME CMD
 13463 pts/1    00:00:00 su
 13469 pts/1    00:00:00 bash
 13729 pts/1    00:00:00 ps

使用

[root@localhost yum.repos.d]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3 128092  6772 ?        Ss   09:22   0:06 /usr/lib/systemd/systemd --switched-root --system
root          2  0.0  0.0      0     0 ?        S    09:22   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    09:22   0:00 [ksoftirqd/0]
root          7  0.0  0.0      0     0 ?        S    09:22   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    09:22   0:00 [rcu_bh]
root          9  0.0  0.0      0     0 ?        R    09:22   0:00 [rcu_sched]
root         10  0.0  0.0      0     0 ?        S    09:22   0:00 [watchdog/0]
root         11  0.0  0.0      0     0 ?        S    09:22   0:00 [watchdog/1]
root         12  0.0  0.0      0     0 ?        S    09:22   0:00 [migration/1]
  • USER 运行进程的用户
  • PID 进程号
  • %CPU cpu 使用率
  • %MEM 内存使用率
  • VSZ 虚拟内存使用率
  • RSS 固定使用的内存
  • TTY 终端信息,该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
  • STAT 进程状态
  • START 进程开始时间
  • TIME 使用掉的 CPU 时间
  • COMMAND 指向的程序路径

进程状态

运行 -R 正在运行或运行队列中等待
中断 -S 休眠中,受阻,在等等某个条件的形成或接受到信息
不可中断 -D
僵死 -Z
停止 -T

进程优先级

< 优先级较高的进程
N 优先级较低的进程
L 有些页被锁住内存
l 多进程的
s 进程的领导者,在它之下有子进程

  • 位于后台的进程组

pstree命令

以进程树的方式查看 可以看到 systemd 是父进程,所有进程都位于其之下。

[root@localhost yum.repos.d]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager───2*[{NetworkManager}]
        ├─2*[abrt-watch-log]
        ├─abrtd
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─alsactl
        ├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon}
        │                 └─3*[{at-spi-bus-laun}]
        ├─at-spi2-registr───2*[{at-spi2-registr}]
        ├─atd
        ├─auditd─┬─audispd─┬─sedispatch
        │        │         └─{audispd}
        │        └─{auditd}
        ├─avahi-daemon───avahi-daemon
        ├─bluetoothd
        ├─caribou───2*[{caribou}]
        ├─chronyd
        ├─colord───2*[{colord}]
        ├─crond
        ├─cupsd
        ├─2*[dbus-daemon───{dbus-daemon}]
        ├─dbus-launch
        ├─dnsmasq───dnsmasq
        ├─evolution-calen───5*[{evolution-calen}]
        ├─evolution-sourc───2*[{evolution-sourc}]
        ├─gdm─┬─Xorg───2*[{Xorg}]
        │     ├─gdm-session-wor─┬─gnome-session─┬─abrt-applet───2*[{abrt-applet}]
        │     │                 │               ├─gnome-settings-───4*[{gnome-settings-}]
        │     │                 │               ├─gnome-shell─┬─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}]
        │     │                 │               │             │             ├─ibus-engine-sim───2*[{ibus-engine-si+
        │     │                 │               │             │             └─2*[{ibus-daemon}]
        │     │                 │               │             └─10*[{gnome-shell}]
        │     │                 │               ├─gnome-software───3*[{gnome-software}]
        │     │                 │               ├─nautilus───3*[{nautilus}]
        │     │                 │               ├─seapplet
        │     │                 │               ├─ssh-agent
        │     │                 │               ├─tracker-extract───13*[{tracker-extract}]
        │     │                 │               ├─tracker-miner-a───2*[{tracker-miner-a}]
        │     │                 │               ├─tracker-miner-f───3*[{tracker-miner-f}]
        │     │                 │               ├─tracker-miner-u───2*[{tracker-miner-u}]
        │     │                 │               └─3*[{gnome-session}]
        │     │                 └─2*[{gdm-session-wor}]
        │     └─3*[{gdm}]
        ├─gnome-keyring-d───4*[{gnome-keyring-d}]
        ├─gnome-shell-cal───5*[{gnome-shell-cal}]
        ├─goa-daemon───3*[{goa-daemon}]
        ├─goa-identity-se───3*[{goa-identity-se}]
        ├─gsd-printer───2*[{gsd-printer}]
        ├─gssproxy───5*[{gssproxy}]
        ├─gvfs-afc-volume───3*[{gvfs-afc-volume}]
        ├─gvfs-goa-volume───2*[{gvfs-goa-volume}]
        ├─gvfs-gphoto2-vo───2*[{gvfs-gphoto2-vo}]
        ├─gvfs-mtp-volume───2*[{gvfs-mtp-volume}]
        ├─gvfs-udisks2-vo───2*[{gvfs-udisks2-vo}]
        ├─gvfsd───2*[{gvfsd}]
        ├─gvfsd-fuse───5*[{gvfsd-fuse}]
        ├─gvfsd-trash───2*[{gvfsd-trash}]
        ├─ibus-x11───2*[{ibus-x11}]
        ├─irqbalance
        ├─ksmtuned───sleep
        ├─libvirtd───15*[{libvirtd}]
        ├─lsmd
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─mcelog
        ├─mission-control───3*[{mission-control}]
        ├─nginx───nginx
        ├─packagekitd───2*[{packagekitd}]
        ├─polkitd───5*[{polkitd}]
        ├─pulseaudio───2*[{pulseaudio}]
        ├─rngd
        ├─rsyslogd───2*[{rsyslogd}]
        ├─rtkit-daemon───2*[{rtkit-daemon}]
        ├─smartd
        ├─sshd─┬─sshd───sshd───bash───su───bash
        │      └─sshd───sshd───bash───su───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tracker-store───7*[{tracker-store}]
        ├─tuned───4*[{tuned}]
        ├─udisksd───4*[{udisksd}]
        ├─upowerd───2*[{upowerd}]
        ├─vmtoolsd───{vmtoolsd}
        ├─vmtoolsd
        ├─vsftpd
        └─wpa_supplicant

查看 systemd,其 进程号为1,父进程号不会改变。

[root@localhost yum.repos.d]# ps aux | grep systemd
root          1  0.0  0.3 128092  6772 ?        Ss   09:22   0:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root        493  0.0  0.2  36944  3880 ?        Ss   09:22   0:00 /usr/lib/systemd/systemd-journald
root        519  0.0  0.2  46912  5160 ?        Ss   09:22   0:00 /usr/lib/systemd/systemd-udevd
dbus        704  0.0  0.1  36456  3368 ?        Ssl  09:22   0:01 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root        733  0.0  0.0  24260  1768 ?        Ss   09:22   0:00 /usr/lib/systemd/systemd-logind
root      14259  0.0  0.0 112652   964 pts/1    S+   12:05   0:00 grep --color=auto systemd

结束进程

[root@localhost yum.repos.d]# ps aux | grep firefox
fwj       13977 20.8 12.5 2130344 231868 ?      Sl   11:56   0:10 /usr/lib64/firefox/firefox
root      14116  0.0  0.0 112648   964 pts/1    R+   11:57   0:00 grep --color=auto firefox
[root@localhost yum.repos.d]# kill -9 13977
[root@localhost yum.repos.d]# ps aux | grep firefox
root      14122  0.0  0.0 112648   964 pts/1    S+   11:58   0:00 grep --color=auto firefox

后台运行

command & 后台运行

ctrl+z 后台运行
ctrl +c 结束进程
sleep 休眠

jobs 查看后台进程
fg[%作业号]
bg[%作业号]

[root@localhost opt]# ping awen.me > test &
[1] 15101
[root@localhost opt]# jobs
[1]+  Running                 ping awen.me > test &
[root@localhost opt]# fg 1
ping awen.me > test

screen 命令

screen 通常是用来实现将某个程序放在后台执行,它会创建一个会话,而当你关闭终端或断开远程连接后,还可以继续连接查看该会话的执行情况,通常用来实现编译软件的时候使用

1.创建一个会话

screen -S lnmp

2.进入一个已经存在的会话

screen -r lnmp

3.列出当前已经存在的会话

screen -list

控制进程

[root@localhost opt]# service vsftpd status
Redirecting to /bin/systemctl status  vsftpd.service
● vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2017-04-23 11:13:24 CST; 2h 25min ago
 Main PID: 12823 (vsftpd)
   CGroup: /system.slice/vsftpd.service
           └─12823 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

Apr 23 11:13:24 localhost.localdomain systemd[1]: Starting Vsftpd ftp daemon...
Apr 23 11:13:24 localhost.localdomain systemd[1]: Started Vsftpd ftp daemon.

RHEL 7 使用 systemctl 控制服务

systemctl start|stop|restart sshd

案例

[root@localhost opt]# systemctl stop vsftpd.service
[root@localhost opt]# systemctl status vsftpd.service
● vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Sun 2017-04-23 13:43:00 CST; 6s ago
 Main PID: 12823 (code=killed, signal=TERM)

Apr 23 11:13:24 localhost.localdomain systemd[1]: Starting Vsftpd ftp daemon...
Apr 23 11:13:24 localhost.localdomain systemd[1]: Started Vsftpd ftp daemon.
Apr 23 13:43:00 localhost.localdomain systemd[1]: Stopping Vsftpd ftp daemon...
Apr 23 13:43:00 localhost.localdomain systemd[1]: Stopped Vsftpd ftp daemon.

查看服务是否开机启动

[root@localhost opt]# systemctl is-enabled sshd
enabled
  • start 开启
  • stop 停止
  • reload 重新加载
  • restart 重启
  • status 查看状态
  • eanble 开机启动
  • disable 开机不启动
  • reenable 重新设置开机启动
  • is-enabled 是否开机启动
  • unmask 不禁用服务
  • mask 禁用服务
  • is-active 是否启动
  • is-failed 是否失败

查看服务文件

[root@localhost opt]# systemctl list-unit-files | grep sshd
anaconda-sshd.service                         static
sshd-keygen.service                           static
sshd.service                                  enabled
sshd@.service                                 static
sshd.socket                                   disabled

使用 RPM 和 YUM

Redaht 系使用 RPM 来管理软件,通常将文件打包成 RPM 格式进行安装

RPM 相关命令

1.帮助

[root@localhost nginx-1.11.13]# rpm --help

2.查看指定包

[root@localhost nginx-1.11.13]# rpm -qa | grep yum
yum-langpacks-0.4.2-7.el7.noarch
yum-plugin-fastestmirror-1.1.31-40.el7.noarch
yum-utils-1.1.31-40.el7.noarch
PackageKit-yum-1.0.7-6.el7.centos.x86_64
yum-3.4.3-150.el7.centos.noarch
yum-metadata-parser-1.1.4-10.el7.x86_64

3.查看命令属于哪个包

[root@localhost ~]# rpm -qf /usr/bin/ls
coreutils-8.22-18.el7.x86_64

4.安装包

[root@localhost Packages]# rpm -ivh vsftpd-3.0.2-21.el7.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:vsftpd-3.0.2-21.el7              ################################# [100%]

yum

1.配置 yum 仓库

   [http]
name=awen
baseurl=http://172.16.230.100/
enabled=0
gpgcheck=1
gppkey=http://172.16.230.100/RPM-GPG-KEY-CentOS-7

[file]
name=awen
baseurl=file:///mnt/
enabled=0
gpgcheck=1
gpgkey=file:///mnt/RPM-GPG-KEY-CentOS-7


[ftp]
name=awen
baseurl=ftp://172.16.230.100/pub/
enabled=1
gpgcheck=1
gpgkey=ftp://172.16.230.100/pub/RPM-GPG-KEY-CentOS-7

2.yum list

[root@localhost yum.repos.d]# yum list | more
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Installed Packages
GConf2.x86_64                           3.2.6-8.el7                    @anaconda
GeoIP.x86_64                            1.5.0-11.el7                   @anaconda
ModemManager.x86_64                     1.6.0-2.el7                    @anaconda
ModemManager-glib.x86_64                1.6.0-2.el7                    @anaconda
NetworkManager.x86_64                   1:1.4.0-19.el7_3               @updates
NetworkManager-adsl.x86_64              1:1.4.0-19.el7_3               @updates
NetworkManager-glib.x86_64              1:1.4.0-19.el7_3               @updates
NetworkManager-libnm.x86_64             1:1.4.0-19.el7_3               @updates
NetworkManager-libreswan.x86_64         1.2.4-1.el7                    @anaconda
NetworkManager-libreswan-gnome.x86_64   1.2.4-1.el7                    @anaconda
NetworkManager-team.x86_64              1:1.4.0-19.el7_3               @updates
NetworkManager-tui.x86_64               1:1.4.0-19.el7_3               @updates
NetworkManager-wifi.x86_64              1:1.4.0-19.el7_3               @updates
PackageKit.x86_64                       1.0.7-6.el7.centos             @anaconda
PackageKit-command-not-found.x86_64     1.0.7-6.el7.centos             @anaconda
PackageKit-glib.x86_64                  1.0.7-6.el7.centos             @anaconda
PackageKit-gstreamer-plugin.x86_64      1.0.7-6.el7.centos             @anaconda
PackageKit-gtk3-module.x86_64           1.0.7-6.el7.centos             @anaconda
PackageKit-yum.x86_64                   1.0.7-6.el7.centos             @anaconda
abattis-cantarell-fonts.noarch          0.0.16-3.el7                   @anaconda
abrt.x86_64                             2.1.11-45.el7.centos           @anaconda
abrt-addon-ccpp.x86_64                  2.1.11-45.el7.centos           @anaconda
abrt-addon-kerneloops.x86_64            2.1.11-45.el7.centos           @anaconda
abrt-addon-pstoreoops.x86_64            2.1.11-45.el7.centos           @anaconda
abrt-addon-python.x86_64                2.1.11-45.el7.centos           @anaconda
abrt-addon-vmcore.x86_64                2.1.11-45.el7.centos           @anaconda

一般复制完,需要更新下数据库createrepo 主要是收集目录中 rpm 包文件的头信息。

[root@localhost pub]# createrepo --database ./
Spawning worker 0 with 1916 pkgs
Spawning worker 1 with 1915 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete

使用 Linux 管理磁盘

如何添加磁盘

物理机器上要扩展磁盘需要主板支持,通常来说家用设备一般2块磁盘足够了,一块 ssd 一块 SATA 盘,而服务器的磁盘则会有几十块,专业的存储设备磁盘可能有几百块。

由于我们使用的是虚拟机,因此我们需要先关闭设备

然后点击编辑虚拟机,点击添加

添加硬盘,然后下一步

后面的步骤和创建虚拟机设置硬盘向导一致

基本的磁盘管理

1.fdisk 命令的使用

fdisk 命令是用来查看当前系统的磁盘设备信息,通过 -l 参数可以查看当前系统的磁盘数量和编号。需要注意该命令只能在 root 用户模式下执行。

[root@server ~]# fdisk -l

Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000a502b

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     2099199     1048576   83  Linux
/dev/sda2         2099200    41943039    19921920   8e  Linux LVM

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/cl-root: 18.2 GB, 18249416704 bytes, 35643392 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mapper/cl-swap: 2147 MB, 2147483648 bytes, 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

如果是普通用户执行,会提示权限不足

$ fdisk -l
fdisk: cannot open /dev/xvda: Permission denied   

其中显示有3块设备,分别是/dev/sda /dev/sdb /dev/sdc。注意 比较老的 IDC 接口设备,是以 HD 开头,而比较新的 SATA 接口 是以 sd 开头,那么当你购买了比如阿里云的服务器,由于其硬盘是虚拟出来的磁盘文件,其格式是xvd

root@aliyun:/home/fangwenjun# fdisk -l
Disk /dev/xvda: 40 GiB, 42949672960 bytes, 83886080 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x839b64ba

Device     Boot Start      End  Sectors Size Id Type
/dev/xvda1 *     2048 83884031 83881984  40G 83 Linux

其中的 abcd,表示磁盘的编号,第一块表示sda 第二块表示 sdb,以此类推。

Device Boot      Start         End      Blocks   Id  System
 /dev/sda1   *        2048     2099199     1048576   83  Linux
 /dev/sda2         2099200    41943039    19921920   8e  Linux LVM

上面我们看到第一块硬盘有sda1 sda2 表示该硬盘分了2个分区分别是 sda1和 sda2 那么你还可以看到在 Boot 下方 sda1 这列有一个* 这表示该系统的主引导扇区是在 sda1上。

分区表

目前来说分区表有2种 一种是 MBR;一种是 GPT
MBR
MBR的全称是Master Boot Record(主引导记录),MBR早在1983年IBM PC DOS 2.0中就已经提出。之所以叫“主引导记录”,是因为它是存在于驱动器开始部分的一个特殊的启动扇区。这个扇区包含了已安装的操作系统的启动加载器和驱动器的逻辑分区信息。

主引导扇区是硬盘的第一扇区。它由三个部分组成,主引导记录MBR、硬盘分区表DPT和硬盘有效标志。在总共512字节的主引导扇区里MBR占446个字节,偏移地址0000H–0088H),它负责从活动分区中装载,并运行系统引导程序;第二部分是Partition table区(DPT分区表),占64个字节;第三部分是Magic number,占2个字节。
MBR 最大只支持2TB 的硬盘,所以对于目前的海量数据存储时代 ,MBR 已经不太适用。MBR只支持最多4个主分区——如果你想要更多分区,你需要创建“扩展分区”,并在其中创建逻辑分区。

在操作系统上使用 MBR 进行分区格式化

注意哦,分区和格式化是2个操作,通常我们先要给磁盘分区,然后在格式化

创建 MBR 分区

1.分区 使用fdisk 命令分区,注意要确认好磁盘的编号哦,不然的话,很可能造成数据丢失,我们这里有3块磁盘,sdb 目前未分区

[root@server ~]# fdisk -l /dev/sdb

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

要执行分区操作,我们之间使用 fdisk 后面跟上磁盘的位置

[root@server ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x3115768a.

Command (m for help):

Command (m for help):后我们可以输入 m 查看参数

Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

Command (m for help): 

下面我们就来给磁盘分4个分区看看效果吧,输入 n,n 表示添加一个新分区,此时会要求你选择分区类型是主分区还是扩展分区,默认是创建主分区

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p):

我们先创建一个主分区

Select (default p): p
Partition number (1-4, default 1): #默认从第一个分区开始
First sector (2048-41943039, default 2048): #扇区的起始位置
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +5G #输入需要创建的分区大小,这里是+5g 表示创建一个5g 大小的主分区
Partition 1 of type Linux and of size 5 GiB is set #默认的分区类型是 linux

查看创建的分区

查看已经创建的分区,输入 p 可以查看已经创建的分区 sdb1

  Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x4f3fef62

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   83  Linux  

查看分区类型,可以输入 l 键查看

Command (m for help): l

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris
 1  FAT12           27  Hidden NTFS Win 82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      39  Plan 9          83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       3c  PartitionMagic  84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
 4  FAT16 <32M      40  Venix 80286     85  Linux extended  c7  Syrinx
 5  Extended        41  PPC PReP Boot   86  NTFS volume set da  Non-FS data
 6  FAT16           42  SFS             87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS/exFAT 4d  QNX4.x          88  Linux plaintext de  Dell Utility
 8  AIX             4e  QNX4.x 2nd part 8e  Linux LVM       df  BootIt
 9  AIX bootable    4f  QNX4.x 3rd part 93  Amoeba          e1  DOS access
 a  OS/2 Boot Manag 50  OnTrack DM      94  Amoeba BBT      e3  DOS R/O
 b  W95 FAT32       51  OnTrack DM6 Aux 9f  BSD/OS          e4  SpeedStor
 c  W95 FAT32 (LBA) 52  CP/M            a0  IBM Thinkpad hi eb  BeOS fs
 e  W95 FAT16 (LBA) 53  OnTrack DM6 Aux a5  FreeBSD         ee  GPT
 f  W95 Ext'd (LBA) 54  OnTrackDM6      a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            55  EZ-Drive        a7  NeXTSTEP        f0  Linux/PA-RISC b
11  Hidden FAT12    56  Golden Bow      a8  Darwin UFS      f1  SpeedStor
12  Compaq diagnost 5c  Priam Edisk     a9  NetBSD          f4  SpeedStor
14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f2  DOS secondary
16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      fb  VMware VMFS
17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE
18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fd  Linux raid auto
1b  Hidden W95 FAT3 70  DiskSecure Mult bb  Boot Wizard hid fe  LANstep
1c  Hidden W95 FAT3 75  PC/IX           be  Solaris boot    ff  BBT
1e  Hidden W95 FAT1 80  Old Minix

那么当你再次按 n 创建,会提示你还可以创建3块主分区

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): 

我们继续创建3块主分区,得到如下结果,显示主分区从sdb1-sdb4,当你创建完4块主分区,那么这块磁盘就不能继续创建主分区了

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x4f3fef62

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   83  Linux
/dev/sdb2        10487808    20973567     5242880   83  Linux
/dev/sdb3        20973568    31459327     5242880   83  Linux
/dev/sdb4        31459328    41943039     5241856    5  Extended           

我们可以看下,再次按 n 会创建 sdb5,观察 sdb 的类型是 Extended 扩展分区

 Command (m for help): n
All primary partitions are in use
Adding logical partition 5
First sector (31461376-41943039, default 31461376):
Using default value 31461376
Last sector, +sectors or +size{K,M,G} (31461376-41943039, default 41943039):
Using default value 41943039
Partition 5 of type Linux and of size 5 GiB is set

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x4f3fef62

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   83  Linux
/dev/sdb2        10487808    20973567     5242880   83  Linux
/dev/sdb3        20973568    31459327     5242880   83  Linux
/dev/sdb4        31459328    41943039     5241856    5  Extended
/dev/sdb5        31461376    41943039     5240832   83  Linux  

删除分区

Command (m for help): d
Partition number (1-5, default 5):
Partition 5 is deleted

Command (m for help): d
Partition number (1-4, default 4):
Partition 4 is deleted

Command (m for help): d
Partition number (1-3, default 3):
Partition 3 is deleted

Command (m for help): d
Partition number (1,2, default 2):
Partition 2 is deleted

Command (m for help): d
Selected partition 1
Partition 1 is deleted

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x4f3fef62

   Device Boot      Start         End      Blocks   Id  System

创建扩展分区

如下,创建扩展分区

    Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): e
Partition number (1-4, default 1):
First sector (2048-41943039, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039):
Using default value 41943039
Partition 1 of type Extended and of size 20 GiB is set

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xfb2fe38a

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    41943039    20970496    5  Extended

扩展分区创建完默认是不能使用的,需要创建扩展分区

Command (m for help): n
Partition type:
   p   primary (0 primary, 1 extended, 3 free)
   l   logical (numbered from 5)
Select (default p): l
Adding logical partition 5
First sector (4096-41943039, default 4096):
Using default value 4096
Last sector, +sectors or +size{K,M,G} (4096-41943039, default 41943039): +512M
Partition 5 of type Linux and of size 512 MiB is set

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xfb2fe38a

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    41943039    20970496    5  Extended
/dev/sdb5            4096     1052671      524288   83  Linux

这样就创建好了一块逻辑分区,注意逻辑分区都是从编号5开始以此类推

保存分区

创建完成后要保存

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks. 

然后查看

[root@server ~]# fdisk -l /dev/sdb

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xfb2fe38a

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    41943039    20970496    5  Extended
/dev/sdb5            4096     1052671      524288   83  Linux    

GPT

GPT的全称是Globally Unique Identifier Partition Table,意即GUID分区表,它的推出是和UEFI BIOS相辅相成的,鉴于MBR的磁盘容量和分区数量已经不能满足硬件发展的需求,GPT首要的任务就是突破了2.2T分区的限制,最大支持18EB的分区。

在分区数量上,GPT会为每一个分区分配一个全局唯一的标识符,理论上GPT支持无限个磁盘分区,不过在Windows系统上由于系统的限制,最多只能支持128个磁盘分区,基本可以满足所有用户的存储需求。在每一个分区上,这个标识符是一个随机生成的字符串,可以保证为地球上的每一个GPT分区都分配完全唯一的标识符。

在安全性方面,GPT分区表也进行了全方位改进。在早期的MBR磁盘上,分区和启动信息是保存在一起的。如果这部分数据被覆盖或破坏,事情就麻烦了。相对的,GPT在整个磁盘上保存多个这部分信息的副本,因此它更为健壮,并可以恢复被破坏的这部分信息。GPT还为这些信息保存了循环冗余校验码(CRC)以保证其完整和正确——如果数据被破坏,GPT会发觉这些破坏,并从磁盘上的其他地方进行恢复。

使用 gdisk 分区

默认系统没有,需要安装

[root@server ~]# yum -y install gdisk

用法和 fdsik 一样

[root@server ~]# gdisk /dev/sdc
GPT fdisk (gdisk) version 0.8.6

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries.

Command (? for help):
    Command (? for help): ?
b    back up GPT data to a file
c    change a partition's name
d    delete a partition
i    show detailed information on a partition
l    list known partition types
n    add a new partition
o    create a new empty GUID partition table (GPT)
p    print the partition table
q    quit without saving changes
r    recovery and transformation options (experts only)
s    sort partitions
t    change a partition's type code
v    verify disk
w    write table to disk and exit
x    extra functionality (experts only)
?    print this menu

根据菜单提示来即可

格式化

分区好了,默认是不能使用的,需要格式化,centos 7 默认的文件系统格式是 xfs,在7以前默认是 ext4 在6以前是 ext3。

1.mkfs 格式化为 ext4

[root@server ~]# mkfs -t ext4 /dev/sdb5
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
32768 inodes, 131072 blocks
6553 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=134217728
4 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
    32768, 98304

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

2.此外系统还要一些默认的命令可以对各种类型的格式进行格式化

[root@server ~]# mkfs.
mkfs.btrfs   mkfs.cramfs  mkfs.ext2    mkfs.ext3    mkfs.ext4    mkfs.fat     mkfs.minix   mkfs.msdos   mkfs.vfat    mkfs.xfs

    [root@server ~]# mkfs.ext4 /dev/sdb5
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
32768 inodes, 131072 blocks
6553 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=134217728
4 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
    32768, 98304

Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

df 命令

df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

df 命令

[root@server ~]# df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/cl-root   17G  1.7G   16G  10% /
devtmpfs             478M     0  478M   0% /dev
tmpfs                489M     0  489M   0% /dev/shm
tmpfs                489M  6.8M  482M   2% /run
tmpfs                489M     0  489M   0% /sys/fs/cgroup
/dev/sda1           1014M  231M  784M  23% /boot
tmpfs                 98M     0   98M   0% /run/user/0

使用 LVM 管理磁盘

创建和查看 PV

1.创建 pv

[root@localhost opt]# pvcreate /dev/sdb{1,2,3,4}
WARNING: dos signature detected on /dev/sdb1 at offset 510. Wipe it? [y/n]: y
  Wiping dos signature on /dev/sdb1.
  Physical volume "/dev/sdb1" successfully created.
  Physical volume "/dev/sdb2" successfully created.
  Physical volume "/dev/sdb3" successfully created.
  Physical volume "/dev/sdb4" successfully created.

2.查看 pv

[root@localhost opt]# pvs
  PV         VG Fmt  Attr PSize  PFree
  /dev/sda2  cl lvm2 a--  19.00g    0
  /dev/sdb1     lvm2 ---   5.00g 5.00g
  /dev/sdb2     lvm2 ---   5.00g 5.00g
  /dev/sdb3     lvm2 ---   5.00g 5.00g
  /dev/sdb4     lvm2 ---   5.00g 5.00g

3.查看详细信息

[root@localhost opt]# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               cl
  PV Size               19.00 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              4863
  Free PE               0
  Allocated PE          4863
  PV UUID               X5WbXW-4qUV-MoYO-1ws3-3y6J-36tz-M5CxPM

  "/dev/sdb1" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               emcwLR-IKkM-9R2G-1rEF-y94t-GLrT-SGk2Qk

  "/dev/sdb3" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb3
  VG Name
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               6gwwXq-vzJD-wxOY-ACAj-mvTI-wyh5-AAZRdp

  "/dev/sdb2" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb2
  VG Name
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               btswJD-I59p-xxWQ-VyLr-Gobc-rVdJ-MqupEG

  "/dev/sdb4" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb4
  VG Name
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               RSP9tx-kWci-Yc9r-P6HF-yUxZ-p3ck-h2oM9g

这里主要观察 PE Size,可以看到是0

创建 vg

1.创建 vg,并且使用-s参数指定 PE 的大小

[root@localhost opt]# vgcreate -s 8M myvg /dev/sdb{1,2,3,4}
  Volume group "myvg" successfully created

2.使用 pvs 查看基本信息

[root@localhost opt]# pvs
  PV         VG   Fmt  Attr PSize  PFree
  /dev/sda2  cl   lvm2 a--  19.00g    0
  /dev/sdb1  myvg lvm2 a--   4.99g 4.99g
  /dev/sdb2  myvg lvm2 a--   4.99g 4.99g
  /dev/sdb3  myvg lvm2 a--   4.99g 4.99g
  /dev/sdb4  myvg lvm2 a--   4.99g 4.99g

3.查看详细信息

[root@localhost opt]# pvdisplay
  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               myvg
  PV Size               5.00 GiB / not usable 8.00 MiB
  Allocatable           yes
  PE Size               8.00 MiB
  Total PE              639
  Free PE               639
  Allocated PE          0
  PV UUID               emcwLR-IKkM-9R2G-1rEF-y94t-GLrT-SGk2Qk

  --- Physical volume ---
  PV Name               /dev/sdb2
  VG Name               myvg
  PV Size               5.00 GiB / not usable 8.00 MiB
  Allocatable           yes
  PE Size               8.00 MiB
  Total PE              639
  Free PE               639
  Allocated PE          0
  PV UUID               btswJD-I59p-xxWQ-VyLr-Gobc-rVdJ-MqupEG

  --- Physical volume ---
  PV Name               /dev/sdb3
  VG Name               myvg
  PV Size               5.00 GiB / not usable 8.00 MiB
  Allocatable           yes
  PE Size               8.00 MiB
  Total PE              639
  Free PE               639
  Allocated PE          0
  PV UUID               6gwwXq-vzJD-wxOY-ACAj-mvTI-wyh5-AAZRdp

  --- Physical volume ---
  PV Name               /dev/sdb4
  VG Name               myvg
  PV Size               5.00 GiB / not usable 6.98 MiB
  Allocatable           yes
  PE Size               8.00 MiB
  Total PE              639
  Free PE               639
  Allocated PE          0
  PV UUID               RSP9tx-kWci-Yc9r-P6HF-yUxZ-p3ck-h2oM9g

  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               cl
  PV Size               19.00 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              4863
  Free PE               0
  Allocated PE          4863
  PV UUID               X5WbXW-4qUV-MoYO-1ws3-3y6J-36tz-M5CxPM

4.查看指定设备

[root@localhost opt]# pvdisplay /dev/sdb3
  --- Physical volume ---
  PV Name               /dev/sdb3
  VG Name               myvg
  PV Size               5.00 GiB / not usable 8.00 MiB
  Allocatable           yes
  PE Size               8.00 MiB
  Total PE              639
  Free PE               639
  Allocated PE          0
  PV UUID               6gwwXq-vzJD-wxOY-ACAj-mvTI-wyh5-AAZRdp

创建和使用 lv

1.创建 lv,名称为 linux,大小为5g 从刚才创建的 myvg 卷组中拿出5g 的大小创建逻辑卷。

[root@localhost opt]# lvcreate -L 5G -n linux myvg
WARNING: LVM2_member signature detected on /dev/myvg/linux at offset 536. Wipe it? [y/n]: y
  Wiping LVM2_member signature on /dev/myvg/linux.
  Logical volume "linux" created.

2.查看基本信息

[root@localhost opt]# lvs
  LV    VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root  cl   -wi-ao---- 17.00g
  swap  cl   -wi-ao----  2.00g
  linux myvg -wi-a-----  5.00g

3.查看详细信息

[root@localhost opt]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/myvg/linux
  LV Name                linux
  VG Name                myvg
  LV UUID                1OmSKi-VHPj-Tbnb-P4IV-2hAQ-u4Il-hc1yl2
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-04-22 10:49:03 +0800
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Current LE             640
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2

  --- Logical volume ---
  LV Path                /dev/cl/swap
  LV Name                swap
  VG Name                cl
  LV UUID                gQsXBL-tMOS-fzaJ-9Rml-U3mv-ubAF-XNc5og
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-04-18 09:42:07 +0800
  LV Status              available
  # open                 2
  LV Size                2.00 GiB
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1

  --- Logical volume ---
  LV Path                /dev/cl/root
  LV Name                root
  VG Name                cl
  LV UUID                tYWq97-Irfv-N3bk-ilqa-SSMH-lZij-G7M9ey
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-04-18 09:42:07 +0800
  LV Status              available
  # open                 1
  LV Size                17.00 GiB
  Current LE             4351
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

4.指定设备查看

[root@localhost opt]# lvdisplay /dev/myvg/linux
  --- Logical volume ---
  LV Path                /dev/myvg/linux
  LV Name                linux
  VG Name                myvg
  LV UUID                1OmSKi-VHPj-Tbnb-P4IV-2hAQ-u4Il-hc1yl2
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-04-22 10:49:03 +0800
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Current LE             640
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2

使用创建的 lv

1.格式化

[root@localhost opt]# mkfs.xfs /dev/
Display all 177 possibilities? (y or n)
[root@localhost opt]# mkfs.xfs /dev/myvg/linux
meta-data=/dev/myvg/linux        isize=512    agcount=4, agsize=327680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=1310720, 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

2.挂载

[root@localhost opt]# mkdir /data
[root@localhost opt]# mount /dev/myvg/linux /data/
[root@localhost opt]# cd /data/
[root@localhost data]# ls

增加容量

lvm 支持在线缩小。

1.先查看 lv 大小

[root@localhost data]# lvs
  LV    VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root  cl   -wi-ao---- 17.00g
  swap  cl   -wi-ao----  2.00g
  linux myvg -wi-ao----  5.00g

2.然后增加5g

[root@localhost data]# lvextend -L +5G /dev/myvg/linux
  Size of logical volume myvg/linux changed from 5.00 GiB (640 extents) to 10.00 GiB (1280 extents).
  Logical volume myvg/linux successfully resized.
[root@localhost data]# lvs
  LV    VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root  cl   -wi-ao---- 17.00g
  swap  cl   -wi-ao----  2.00g
  linux myvg -wi-ao---- 10.00g

3.查看增加后的容量

[root@localhost data]# lvs
  LV    VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root  cl   -wi-ao---- 17.00g
  swap  cl   -wi-ao----  2.00g
  linux myvg -wi-ao---- 10.00g

使用lvresize 增加 lv 大小
1.查看目前的 lvs 大小

[root@localhost data]# lvs
  LV    VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root  cl   -wi-ao---- 17.00g
  swap  cl   -wi-ao----  2.00g
  linux myvg -wi-ao----  5.00g
  lv1   myvg -wi-ao---- 11.00g

2.目前11g,增加到12g,这里的-L 后大小一定要比当前的大小大,否则则是缩小逻辑卷的大小,另外也可以使用+来增加。

[root@localhost data]# lvresize -L 12G /dev/myvg/lv1
  Size of logical volume myvg/lv1 changed from 11.00 GiB (2816 extents) to 12.00 GiB (3072 extents).
  Logical volume myvg/lv1 successfully resized.

3.查看 lvs 大小。

[root@localhost data]# lvs
  LV    VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root  cl   -wi-ao---- 17.00g
  swap  cl   -wi-ao----  2.00g
  linux myvg -wi-ao----  5.00g
  lv1   myvg -wi-ao---- 12.00g

4.查看目前挂载的目录,发现还是11G

[root@localhost data]# df -h /ext4/
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/myvg-lv1   11G   25M   11G   1% /ext4

5.使用resize2fs 刷新磁盘

[root@localhost data]# resize2fs /dev/myvg/lv1
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/myvg/lv1 is mounted on /ext4; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 2
The filesystem on /dev/myvg/lv1 is now 3145728 blocks long.

6.再次查看

[root@localhost data]# df -h /ext4/
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/myvg-lv1   12G   25M   12G   1% /ext4

增加后一定要使用resize2fs 刷新磁盘,否则容量不正确。

减小容量

1.查看容量

[root@localhost data]# lvs
  LV    VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root  cl   -wi-ao---- 17.00g
  swap  cl   -wi-ao----  2.00g
  linux myvg -wi-ao---- 10.00g

2.减小容量

注意:缩小容量前一定要先卸载对应的逻辑卷

先查看

[root@localhost /]# lvs
  LV     VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root   cl   -wi-ao---- 17.00g
  swap   cl   -wi-ao----  2.00g
  lv_xfs myvg -wi-a-----  7.00g
  mylv1  myvg -wi-ao----  5.00g

查看挂载的容量

[root@localhost /]# df -h /mnt/data
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/myvg-mylv1  4.8G   20M  4.6G   1% /mnt/data

先缩小文件系统的大小,提示需要先 umount

[root@localhost /]# resize2fs /dev/myvg/mylv1 400M
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/myvg/mylv1 is mounted on /mnt/data; on-line resizing required
resize2fs: On-line shrinking not supported

取消挂载

[root@localhost /]# umount /mnt/data

再次运行刚才的命令,提示需要运行 e2fsck -f /dev/myvg/mylv1

[root@localhost /]# resize2fs /dev/myvg/mylv1 400M
resize2fs 1.42.9 (28-Dec-2013)
Please run 'e2fsck -f /dev/myvg/mylv1' first.

执行e2fsck -f /dev/myvg/mylv1

[root@localhost /]# e2fsck -f /dev/myvg/mylv1
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/myvg/mylv1: 11/327680 files (0.0% non-contiguous), 58462/1310720 blocks

再次执行刚才的命令

[root@localhost /]# resize2fs /dev/myvg/mylv1 400M
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/myvg/mylv1 to 102400 (4k) blocks.
The filesystem on /dev/myvg/mylv1 is now 102400 blocks long.

OK,成功了,然后在缩小逻辑卷

[root@localhost /]# lvresize -L 400M /dev/myvg/mylv1
  WARNING: Reducing active logical volume to 400.00 MiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce myvg/mylv1? [y/n]: y
  Size of logical volume myvg/mylv1 changed from 5.00 GiB (1280 extents) to 400.00 MiB (100 extents).
  Logical volume myvg/mylv1 successfully resized.

查看 lv 的大小,已经是400M 了

[root@localhost /]# lvs
  LV     VG   Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root   cl   -wi-ao----  17.00g
  swap   cl   -wi-ao----   2.00g
  lv_xfs myvg -wi-a-----   7.00g
  mylv1  myvg -wi-a----- 400.00m

重新挂载

[root@localhost /]# mount /dev/myvg/mylv1 /mnt/data

查看挂载后的大小,一切正常

[root@localhost /]# df -h /mnt/data
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/myvg-mylv1  264M  7.6M  229M   4% /mnt/data

4.xfs 格式扩容或减小挂载出错

[root@localhost /]# resize2fs /dev/myvg/lv_xfs
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: Bad magic number in super-block while trying to open /dev/myvg/lv_xfs
Couldn't find valid filesystem superblock.
#xfs 格式需要使用 xfs_growfs命令
[root@localhost /]# xfs_growfs /dev/myvg/lv_xfs
meta-data=/dev/mapper/myvg-lv_xfs isize=512    agcount=4, agsize=327680 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=1310720, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 1310720 to 1835008
[root@localhost /]# clear
[root@localhost /]# df -h /mnt/data1/
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/myvg-lv_xfs  7.0G   33M  7.0G   1% /mnt/data1
[root@localhost /]#

删除

删除的顺序是先 lv–> vg —> pv 的顺序

删除 lv

1.先卸载

[root@localhost /]# umount /dev/myvg/linux

2.删除 lv

[root@localhost /]# lvremove /dev/myvg/linux
Do you really want to remove active logical volume myvg/linux? [y/n]: y
  Logical volume "linux" successfully removed

3.查看 lv

[root@localhost /]# lvs
  LV   VG Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root cl -wi-ao---- 17.00g
  swap cl -wi-ao----  2.00g

删除 vg

1.删除 vg

[root@localhost /]# vgremove myvg
  Volume group "myvg" successfully removed

2.查看 vg

[root@localhost /]# vgs
  VG #PV #LV #SN Attr   VSize  VFree
  cl   1   2   0 wz--n- 19.00g    0

删除 pv

1.删除 pv

[root@localhost /]# pvremove /dev/sdb{1,2,3,4}
  Labels on physical volume "/dev/sdb1" successfully wiped.
  Labels on physical volume "/dev/sdb2" successfully wiped.
  Labels on physical volume "/dev/sdb3" successfully wiped.
  Labels on physical volume "/dev/sdb4" successfully wiped.

2.查看 pv

[root@localhost /]# pvs
  PV         VG Fmt  Attr PSize  PFree
  /dev/sda2  cl lvm2 a--  19.00g    0

扩充 VG

1.先分区

[root@localhost /]# fdisk /dev/sdc
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p

Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x07c19514

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            2048    41943039    20970496    5  Extended
/dev/sdc5            4096     1028095      512000   83  Linux

Command (m for help): n
Partition type:
   p   primary (0 primary, 1 extended, 3 free)
   l   logical (numbered from 5)
Select (default p): l
Adding logical partition 6
First sector (1030144-41943039, default 1030144):
Using default value 1030144
Last sector, +sectors or +size{K,M,G} (1030144-41943039, default 41943039):
Using default value 41943039
Partition 6 of type Linux and of size 19.5 GiB is set

Command (m for help): p

Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x07c19514

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            2048    41943039    20970496    5  Extended
/dev/sdc5            4096     1028095      512000   83  Linux
/dev/sdc6         1030144    41943039    20456448   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

2.添加 pv

[root@localhost /]# pvcreate /dev/sdc6
  Physical volume "/dev/sdc6" successfully created.

3.查看 pv

[root@localhost /]# pvs
  PV         VG   Fmt  Attr PSize  PFree
  /dev/sda2  cl   lvm2 a--  19.00g     0
  /dev/sdb1  myvg lvm2 a--  10.00g  9.61g
  /dev/sdb2  myvg lvm2 a--  10.00g  3.00g
  /dev/sdc6       lvm2 ---  19.51g 19.51g

4.扩充 vg,将 sdc6的容量添加到 vg 卷组 myvg 中

[root@localhost /]# vgextend myvg /dev/sdc6
  Volume group "myvg" successfully extended
[root@localhost /]# vgs
  VG   #PV #LV #SN Attr   VSize  VFree
  cl     1   2   0 wz--n- 19.00g     0
  myvg   3   2   0 wz--n- 39.50g 32.11g

重读分区表

如分区后提示分区不存在,则输入partprobe 刷新分区表

[root@localhost /]# partprobe

设置交换分区

查看内存

# free -h
             total       used       free     shared    buffers     cached
Mem:          990M       582M       408M       544K        30M       330M
-/+ buffers/cache:       221M       769M
Swap:           0B         0B         0B

设置交换分区大小

# fallocate -l 2G /tmp/swapfile
# chmod 600 /tmp/swapfile
# mkswap /tmp/swapfile
mkswap: /tmp/swapfile: warning: don't erase bootbits sectors
        on whole disk. Use -f to force.
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=79458b07-c40c-45f4-99ac-c39c43302ade
# swapon /tmp/swapfile

再次查看

# free -h
             total       used       free     shared    buffers     cached
Mem:          990M       583M       407M       544K        30M       330M
-/+ buffers/cache:       222M       768M
Swap:         2.0G         0B       2.0G

这里面的fallocate 是一个快速创建大文件的命令,fallocate的功能是为文件预分配物理空间,linux 中三种创建大文件的方式

三种创建10G大文件的方法

# fallocate -l 10G bigfile
# truncate -s 10G bigfile
# dd of=bigfile bs=1 seek=10G count=0

fallocate与 dd 都可以创建大文件,但是fallocate的速度要比 dd 快很多,原因是 fallocate 是一个 System call,由文件系统支持, 其创建的是一个稀疏文件, 或者说预分配空间.实际上没有写入实际数据, 而 dd 则是真的写了 1G 的零进去.

在 Linux 编辑文件

在 Windows 中,我们可以使用 Word、记事本以及一些好用的工具来编辑文件,比如博主就喜欢用 sublime text,但是在 Linux 中,编辑文件对于新手而言,可不是一件简单的事情。因为大多数情况下,我们都是远程到设备上进行系统管理,纯字符界面,那么我们如何对文件进行编辑呢?其实,在 Linux 下有一个非常强大的编辑器—-vi,曾经他被誉为是编辑器之神,我的一个同事写 PHP 的,他的日常工作下就是只用 vim 来写代码。不过随着现在技术的发展,越来越多人选择使用更人性化的 IDE 来写代码了。但是一些老鸟还是喜欢用 vim,VIM 是 vi 的一个增强版。我也建议大家使用 vim,应为确实要比 vi 好用很多。

那么如何使用 vim 呢?

vi编辑器

默认情况下,所有的发行版都会自带 vi 编辑器,但是有可能不会安装 vim 编辑器,使用 vi 的话,你可以直接在终端输入 vi 就可以打开了

[root@server ~]# vi

打开之后,你会看到 vi 的 version是 7.4.160,那么有小伙伴就开始输入内容了,发现,哎,天了撸,怎么输入内容都没有反应,立马心里默默的喊了句“垃圾,还没有 Windows 的记事本好用”,年轻人,不要心急,那是你还没能驾驭他,等你熟练掌握了,你会心里默默的喊一句,哎呀,我曹,这货真好用

vi 的三种工作模式

  • 普通模式
  • 插入模式
  • 命令行模式

当你输入 vi 后进入的是普通模式,在该模式下你不能编辑,只有在插入模式下你才可以编辑内容,那么如果在这三种模式下进行切换呢?

当你进入 vi 后,按键盘i键即可进入插入模式,后面会列出常用的快捷键和按键左右,然后你就可以进入插入模式编辑文件了,当你进入插入模式,左下角会有 INSERT 的提示

好了,我们开始输入一段文字

然后我们要怎么保存呢?这个时候不要慌,按下 ESC 键盘,注意要切换输入法在英文模式下哦,否则是不行的,按过后,你会发现左下角的 INSERT 不见了,就说明你的按键生效了,此时我们输入:w hello 就保存了,因为我们默认是直接打开 vi 的,所以要给文件取个名字

保存后会有提示

如果退出呢?退出的话还是要在命令行模式下输入q!,如果你希望编辑完文件就退出则输入wq!

好了,那么我们学会了基本的 vi 使用了,我们来看下刚才编辑的文件在哪儿呢?我们 ls 看下,默认情况下,因为刚才我们直接输入的是:w hello 他会把文件保存在当前打开编辑器所在的路径下

[root@server ~]# ls
hello
[root@server ~]# pwd
/root

我们要编辑一个已经存在的文件则输入vi 文件路径即可,比如我们要编辑 /etc/ssh/sshd_config 文件,则输入

[root@server ~]# vi /etc/ssh/sshd_config

即可打开

恩,建议小伙伴不要直接编辑这个文件,复制一份到其他目录去学习 vim 的使用吧,否则出错了很可能导致无法远程 SSH 连接哦

[root@server ~]# cp /etc/ssh/sshd_config /opt/
[root@server ~]# cd /opt/
[root@server opt]# ls
acl  sshd_config

那么,我们经常对文本进行的操作有、上下左右移动、复制、剪切、删除、还原等等,这些在 vi 下要如何操作呢,我这边列了一个表。大家可以看看

字符移动

字符间移动用键盘 h,j,k,l 左下上右移动,但是必须是在普通式下进行

行内移动

w 正向移动到相邻单词的首字符
b 逆向移动到相邻单词的首字符
B 向前一个单词,以空格和TAB为分隔符
e 正向移动到相邻单词的尾字符
ge 逆向移动到相邻单词的尾字符
0 数字0,左移光标到本行的开始;
$ 右移光标,到本行的末尾;
^ 移动光标,到本行的第一个非空字符

页移动

H 跳转到当前屏幕的第一行
M 跳转到本屏显示的中间一行
L 跳转到最后一行
2H 表示将光标移到屏幕的第2行
3L 表示将光标移到屏幕的倒数第3行
z + enter 是当前行成为屏幕的第一行
z + - 是当前一行成为最后一行
ctrl + f 在文件中前移一页(相当于 page down);
ctrl + b 在文件中后移一页(相当于 page up);
ctrl + d 往下滚动半屏
ctrl + u 往上滚动半屏

文件移动

gg 跳到首行
G 调到尾行
nG 跳转到n行
% 跳到另一边括号

配合查找字符的方式移动

fa 正向移动到第一个字符 a 处
Fa 逆向移动到第一个字符 a 处

非相邻的单词或字符间移动

8w 正向移动到相隔八个单词的首字符
4Fa 逆向移动到第四个 a 字符

更大范围的移动

* 当光标停留在一个单词上,* 键会在文件内搜索该单词,并跳转到下一处;
# 当光标停留在一个单词上,# 在文件内搜索该单词,并跳转到上一处;
(/) 移动到 前/后 句 的开始;
{/} 跳转到 当前/下一个 段落 的开始。
g_ 到本行最后一个不是 blank 字符的位置。
fa 到下一个为 a 的字符处,你也可以fs到下一个为s的字符。
t, 到逗号前的第一个字符。逗号可以变成其它字符。
3fa 在当前行查找第三个出现的 a。
F/T 和 f 和 t 一样,只不过是相反方向;
gg 将光标定位到文件第一行起始位置;
G 将光标定位到文件最后一行起始位置;
NG或Ngg 将光标定位到第 N 行的起始位置

搜索匹配

/text 向后搜索
?text 向前搜索
:g/targetWord 全局搜索
:%s/oldWord/newWord/gc 全局替换
n 搜索下一个同样的内容
N 搜索上一个同样的内容

替换和删除

Vim常规的删除命令是 d、 x (前者删除 行 ,后者删除 字符 ),结合Vim的其他特性可以实现基础的删除功能。将光标定位于文件内指定位置后,可以用其他字符来替换光标所指向的字符,或从当前光标位置删除一个或多个字符或一行、多行
gg dG 删除全部内容
d0 删除至行首
dl 删除当前字符, dl=x
dh 删除前一个字符
dd 删除当前行
dj 删除上一行
dk 删除下一行
dw 删除到下一个单词开头
de 删除到本单词末尾
dE 删除到本单词末尾包括标点在内
db 删除到前一个单词
dB 删除到前一个单词包括标点在内
10d 删除当前行开始的10行
d$ 删除当前字符之后的所有字符(本行)
D 删除当前字符至行尾。D=d$
kd gg 删除当前行之前所有行(不包括当前行)
jdG 删除当前行之后所有行(不包括当前行)
:1,10d 删除1-10行
:11,$d 删除11行及以后所有的行
:1,$d 删除所有行
J 删除两行之间的空行,实际上是合并两行
rc 用 c 替换光标所指向的当前字符;
nrc 用 c 替换光标所指向的前 n 个字符;
5rA 用 A 替换光标所指向的前 5 个字符;
x 删除光标所指向的当前字符;
nx 删除光标所指向的前 n 个字符;
3x 删除光标所指向的前 3 个字符;
dw 删除光标右侧的字;
ndw 删除光标右侧的 n 个字;
3dw 删除光标右侧的 3 个字;
db 删除光标左侧的字;
ndb 删除光标左侧的 n 个字;
5db 删除光标左侧的 5 个字;
dd 删除光标所在行,并去除空隙;
ndd 删除(剪切) n 行内容,并去除空隙;
3dd 删除(剪切) 3 行内容,并去除空隙;
Vim常规的替换命令有 c 和 s ,结合Vim的其他特性可以实现基础的替换功能,不过替换命令执行以后,通常会由 编辑模式 进入 插入模式
s 用输入的正文替换光标所指向的字符;
S 删除当前行,并进入编辑模式;
ns 用输入的正文替换光标右侧 n 个字符;
nS 删除当前行在内的 n 行,并进入编辑模式;
cw 用输入的正文替换光标右侧的字;
cW 用输入的正文替换从光标到行尾的所有字符(同 c$ );
ncw 用输入的正文替换光标右侧的 n 个字;
cb 用输入的正文替换光标左侧的字;
ncb 用输入的正文替换光标左侧的 n 个字;
cd 用输入的正文替换光标的所在行;
ncd 用输入的正文替换光标下面的 n 行;
c$ 用输入的正文替换从光标开始到本行末尾的所有字符;
c0 用输入的正文替换从本行开头到光标的所有字符。    

复制粘贴

yy 拷贝当前行
nyy 拷贝当前后开始的n行,比如2yy拷贝当前行及其下一行 
*“+y 复制 1 行到操作系统的粘贴板 
*“+nyy 复制 n 行到操作系统的粘贴板
:1,10 co 20 将1-10行插入到第20行之后
:1,co 将整个文件复制一份并添加到文件尾部
正常模式下按v(逐字)或V(逐行)进入可视模式,然后用jklh命令移动即可选择某些行或字符,再按y即可复制
ddp 交换当前行和其下一行
xp 交换当前字符和其后一个字符
正常模式下按v(逐字)或V(逐行)进入可视模式,然后用jklh命令移动即可选择某些行或字符,再按d即可剪切
ndd 剪切当前行之后的n行。利用p命令可以对剪切的内容进行粘贴
:1,10d 将1-10行剪切。利用p命令可将剪切后的内容进行粘贴。
:1, 10 m 20 将第1-10行移动到第20行之后。
x 剪切当前字符
3x 剪切当前光标开始向后三个字符
X 剪切当前字符的前一个字符。X=dh
p 粘贴到下一行或右侧,修改和删除的数据自动到粘贴板中
P 粘贴到上一行或左侧
如果是要替换别的单词,则先按 v 进入 visual mode,选中要替换的单词,再按粘贴即可,粘贴板中就换成了被替换的单词
yiw (yank inner word)在一个单词的任意字母使用,就复制该单词
yw 则只是复制从光标所在字母到词尾的部分

撤销和重复

u 撤销最近一次修改 undo
. 重复最后一条修改正文的命令
U 撤销所有修改
ctrl + r 取消最后一次的撤销 redo

块编辑

v 可进入visual模式,使用标准快捷键移动光标可选择文本块,之后可输入标准编辑命令
ctrl + v 列编辑
行尾块…

命令行模式下的一些技巧

DTc 删除从光标的c之间的所有字符
Rc 将光标的字符替换为c
nDD 删除n行数据
nYY 复制n行数据
nX 删除n个字符
R 进入替换状态,esc退出

插入模式

进入

i 在当前位置生前插入
I 在当前行首插入
a 在当前位置后插入
A 在当前行尾插入
o 在当前行之后插入一行
O 在当前行之前插入一行
s 删掉当前字符,并进行输入
x 删掉当前字符,停留在Normal模式
退出

Esc
ctrl + O 暂时性的
ctrl + C 取消当前的任何操作
ctrl + [ 官方推荐替换Esc
移动光标 尽量不要进入插入模式移动光标

ctrl + H 光标移当前行行首 imap
ctrl + J 光标移下一行行首 imap
ctrl + K 光标移上一行行尾 imap
ctrl + L 光标移当前行行尾 imap
Alt + H 光标左移一格 imap
Alt + J 光标下移一格 imap
Alt + K 光标上移一格 imap
Alt + L 光标右移一格 imap

命令模式

打开、保存

:e path_to_file/filename 在已经启动的Vim中打开一个文件
:w 保存当前编辑的文件
:w file_temp 将当前文件另存为file_temp

退出

ZZ 保存并退出
:wq 保存并退出
:e! 放弃所有修改,并打开原来文件
Shift +Z,Q 无条件退出
q! 无条件退出
ctrl + Z 退出vim,不推荐,会生成.swp的文件

行号与文件

编辑中的每一行正文都有自己的行号,用下列命令可以移动光标到指定行(效果与 编辑模式 下的 ngg 或 nG 相同)

:n 将光标移到第 n 行

命令模式下,可以规定命令操作的行号范围。数值用来指定绝对行号;字符“.”表示光标所在行的行号;字符符“$”表示正文最后一行的行号;简单的表达式,例如“.+5”表示当前行往下的第 5 行。例如

:345         将光标移到第 345 行
:345w file   将第 345 行写入 file 文件
:3,5w file   将第 3 行至第 5 行写入 file 文件
:1,.w file   将第 1 行至当前行写入 file 文件
:.,$w file   将当前行至最后一行写入 file 文件
:.,.+5w file 从当前行开始将 6 行内容写入 file 文件
:1,$w file   将所有内容写入 file 文件,相当于 :w file 命令

在命令模式下,允许从文件中读取正文,或将正文写入文件

:w         将编辑的内容写入原始文件,用来保存编辑的中间结果
:wq        将编辑的内容写入原始文件并退出编辑程序(相当于 ZZ 命令)
:w file    将编辑的内容写入 file 文件,保持原有文件的内容不变
:a,bw file 将第 a 行至第 b 行的内容写入 file 文件
:r file    读取 file 文件的内容,插入当前光标所在行的后面
:e file    编辑新文件 file 代替原有内容
:f file    将当前文件重命名为 file
:f         打印当前文件名称和状态,如文件的行数、光标所在的行号等

字符串搜索

在 编辑模式 讲过字符串的搜索,此处的 命令模式 也可以进行字符串搜索,给出一个字符串,可以通过搜索该字符串到达指定行。如果希望进行正向搜索,将待搜索的字符串置于两个 / 之间;如果希望反向搜索,则将字符串放在两个 ? 之间

    :/str/               正向搜索,将光标移到下一个包含字符串 str 的行
    :?str?               反向搜索,将光标移到上一个包含字符串 str 的行
    :/str/w file         正向搜索,并将第一个包含字符串 str 的行写入 file 文件
    :/str1/,/str2/w file 正向搜索,并将包含字符串 str1 的行至包含字符串 str2 的行写

Vim中的正则表达式

:/struct/ 要搜索一行正文,这行正文的开头包含 struct 字
因为它只找出在行中任意位置包含 struct的第一行,并不一定在行的开始包含 struct 。解决问题的办法是在搜索字符串前面加上特殊字符^
:/^struct/
也可以用类似办法在搜索字符串后面加上表示行的末尾的特殊字符 $ 来找出位于行末尾的字
:/struct$/

其他编辑器

在 linux 中还有一些其他的编辑器,比如 nano,此处不过多介绍,我平时都是习惯用 vim

echo 命令

此外,简单的文件编辑,还可以直接用 echo

[root@server opt]# echo "hello" >> world
[root@server opt]# cat world
hello    

在Linux中查找文件

在操作系统中,我们通常不知道某个命令或某个文件在什么地方,这个时候我们需要查找,我们要如何做呢?

查找命令

which

which 命令是用来查找某个命令在什么目录下的,which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。比如我们希望知道 ls 这个命令在哪个目录

[root@server opt]# which ls
alias ls='ls --color=auto'
    /usr/bin/ls

可以看到,ls 命令在/usr/bin/下

参数

Usage: /usr/bin/which [options] [--] COMMAND [...]
Write the full path of COMMAND(s) to standard output.

  --version, -[vV] Print version and exit successfully.
  --help,          Print this help and exit successfully.
  --skip-dot       Skip directories in PATH that start with a dot.
  --skip-tilde     Skip directories in PATH that start with a tilde.
  --show-dot       Don't expand a dot to current directory in output.
  --show-tilde     Output a tilde for HOME directory for non-root.
  --tty-only       Stop processing options on the right if not on tty.
  --all, -a        Print all matches in PATH, not just the first
  --read-alias, -i Read list of aliases from stdin.
  --skip-alias     Ignore option --read-alias; don't read stdin.
  --read-functions Read shell functions from stdin.
  --skip-functions Ignore option --read-functions; don't read stdin.

Recommended use is to write the output of (alias; declare -f) to standard
input, so that which can show aliases and shell functions. See which(1) for
examples.

If the options --read-alias and/or --read-functions are specified then the
output can be a full alias or function definition, optionally followed by
the full path of each command used inside of those.

Report bugs to <which-bugs@gnu.org>. 

whereis

whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。

[root@server opt]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz

参数

Usage:
 whereis [options] file

Options:
 -b         search only for binaries
 -B <dirs>  define binaries lookup path
 -m         search only for manuals
 -M <dirs>  define man lookup path
 -s         search only for sources
 -S <dirs>  define sources lookup path
 -f         terminate <dirs> argument list
 -u         search for unusual entries
 -l         output effective lookup paths

find

find 是最常用的强大查找命令,其使用格式是

find 指定目录 指定条件 指定动作
  • <指定目录>: 所要搜索的目录及其所有子目录。默认为当前目录。
  • <指定条件>: 所要搜索的文件的特征。
  • <指定动作>: 对搜索结果进行特定的处理。

如果什么参数也不加,find默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显示在屏幕上。

参数

-name   filename             #查找名为filename的文件
-perm                        #按执行权限来查找
-user    username             #按文件属主来查找
-group groupname            #按组来查找
-mtime   -n +n                #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime    -n +n               #按文件访问时间来查GIN: 0px">

-ctime    -n +n              #按文件创建时间来查找文件,-n指n天以内,+n指n天以前

-nogroup                     #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser                     #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer   f1 !f2              找文件,-n指n天以内,+n指n天以前 
-ctime    -n +n               #按文件创建时间来查找文件,-n指n天以内,+n指n天以前 
-nogroup                     #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser                      #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer   f1 !f2               #查更改时间比f1新但比f2旧的文件
-type    b/d/c/p/l/f         #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size      n[c]               #查长度为n块[或n字节]的文件
-depth                       #使查找在进入子目录前先行查找完本目录
-fstype                     #查更改时间比f1新但比f2旧的文件
-type    b/d/c/p/l/f         #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size      n[c]               #查长度为n块[或n字节]的文件
-depth                       #使查找在进入子目录前先行查找完本目录
-fstype                      #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount                       #查文件时不跨越文件系统mount点
-follow                      #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio                %;      #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount                       #查文件时不跨越文件系统mount点
-follow                      #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio                        #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune                       #忽略某个目录

示例

find   -name april*                     在当前目录下查找以april开始的文件
find   -name   april*   fprint file        在当前目录下查找以april开始的文件,并把结果输出到file中
find   -name ap* -o -name may*   查找以ap或may开头的文件
find   /mnt   -name tom.txt   -ftype vfat   在/mnt下查找名称为tom.txt且文件系统类型为vfat的文件
find   /mnt   -name t.txt ! -ftype vfat   在/mnt下查找名称为tom.txt且文件系统类型不为vfat的文件
find   /tmp   -name wa* -type l            在/tmp下查找名为wa开头且类型为符号链接的文件
find   /home   -mtime   -2                 在/home下查最近两天内改动过的文件
find /home    -atime -1                  查1天之内被存取过的文件
find /home -mmin    +60                  在/home下查60分钟前改动过的文件
find /home   -amin   +30                  查最近30分钟前被存取过的文件
find /home   -newer   tmp.txt             在/home下查更新时间比tmp.txt近的文件或目录
find /home   -anewer   tmp.txt            在/home下查存取时间比tmp.txt近的文件或目录
find   /home   -used   -2                  列出文件或目录被改动过之后,在2日内被存取过的文件或目录
find   /home   -user cnscn                列出/home目录内属于用户cnscn的文件或目录
find   /home   -uid   +501                  列出/home目录内用户的识别码大于501的文件或目录
find   /home   -group   cnscn              列出/home内组为cnscn的文件或目录
find   /home   -gid 501                   列出/home内组id为501的文件或目录
find   /home   -nouser                    列出/home内不属于本地用户的文件或目录
find   /home   -nogroup                   列出/home内不属于本地组的文件或目录
find   /home    -name tmp.txt    -maxdepth   4   列出/home内的tmp.txt 查时深度最多为3层
find   /home   -name tmp.txt   -mindepth   3   从第2层开始查
find   /home   -empty                     查找大小为0的文件或空目录
find   /home   -size   +512k                查大于512k的文件
find   /home   -size   -512k               查小于512k的文件
find   /home   -links   +2                查硬连接数大于2的文件或目录
find   /home   -perm   0700                查权限为700的文件或目录
find   /tmp   -name tmp.txt   -exec cat {} \;
find   /tmp   -name   tmp.txt   -ok   rm {} \;

find    /   -amin    -10     # 查找在系统中最后10分钟访问的文件
find    /   -atime   -2        # 查找在系统中最后48小时访问的文件
find    /   -empty             # 查找在系统中为空的文件或者文件夹
find    /   -group   cat        # 查找在系统中属于 groupcat的文件
find    /   -mmin   -5         # 查找在系统中最后5分钟里修改过的文件
find    /   -mtime   -1       #查找在系统中最后24小时里修改过的文件
find    /   -nouser           #查找在系统中属于作废用户的文件
find    /   -user    fred     #查找在系统中属于FRED这个用户的文件

查当前目录下的所有普通文件,并用 ls 列出来

[root@server opt]# find . -type f -exec ls -l {} \;
-rw-------. 1 root root 4361 Jun 27 08:39 ./sshd_config
-rw-r--r--. 1 root root 6 Jun 27 21:31 ./world

exec 命令

-exec 参数后面跟的是 command 命令,它的终止是以“;”为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。

{} 花括号代表前面find查找出来的文件名。

在/logos目录中查找更改时间在5日以前的文件并删除它们:

$ find logs -type f -mtime +5 -exec   -ok   rm {} \;

查询当天修改过的文件

[root@book class]# find   ./   -mtime   -1   -type f   -exec   ls -l   {} \;

locate

locate命令其实是“find -name”的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。

搜索 etc 目录以 sh 开头的文件

  [root@server opt]# locate /etc/sh
/etc/shadow
/etc/shadow-
/etc/shells

Linux 的环境变量

当我们输入 ls 系统会找到 ls 并且执行该命令,但是系统是如何找到这个命令的呢。我们上面用 whereis 和 which 可以查到 ls 的命令所在路径。是在/usr/bin/ls,其实操作系统是通过预先设定的一个环境变量值来找到该目录,去执行这个命令的。

我们来写一个简单的shell 脚本

[root@server opt]# pwd
/opt
[root@server opt]# vim test

内容如下

[root@server opt]# cat test
#!/bin/bash
echo "hello world!"

赋予脚本可执行权限

[root@server opt]# chmod +x test

执行脚本,通常是需要指定 shell 然后后面跟上 脚本的名称,例如下面2种方法都可以执行该脚本

[root@server opt]# bash test
hello world!
[root@server opt]# ./test
hello world!

但是,我们当前是在 opt 目录,而我们要切换到其他目录,比如/usr 目录。我们在想执行这个脚本就无能为力了

[root@server usr]# bash test
/usr/bin/test: /usr/bin/test: cannot execute binary file
[root@server usr]# ./test
-bash: ./test: No such file or directory

但是我们可以使用绝对路径来执行

[root@server usr]# bash /opt/test
hello world!
[root@server usr]# /opt/test
hello world!

而这样的方式,我们通常是不希望的,我们希望的是能和使用 ls 命令那样 在任何目录都可以输入 test 就运行这个脚本,那么就需要使用环境变量了。

Linux 操作系统提供了2种,一种是用户的环境变量,通常他是在每个用户自己的家目录下,另一种是全局的环境变量

全局环境变量和用户环境变量

全局环境变量文件,通常2个文件控制,一个是 profile 一个是 bashrc

[root@server usr]# ll /etc/profile
-rw-r--r--. 1 root root 1795 Nov  5  2016 /etc/profile
[root@server usr]# ll /etc/bashrc
-rw-r--r--. 1 root root 2853 Nov  5  2016 /etc/bashrc

用户目录环境变量在用户自己的家目录下,有2个隐藏文件

[test1@server ~]$ ll .bashrc
-rw-r--r--. 1 test1 test1 231 Dec  6  2016 .bashrc
[test1@server ~]$ ll .bash_profile
-rw-r--r--. 1 test1 test1 193 Dec  6  2016 .bash_profile

bashrc与profile的区别

要搞清bashrc与profile的区别,首先要弄明白什么是交互式shell和非交互式shell,什么是login shell 和non-login shell。

交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。 shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。

bashrc与profile都用于保存用户的环境信息,bashrc用于交互式non-loginshell,而profile用于交互式login shell。系统中存在许多bashrc和profile文件,下面逐一介绍:

/etc/profile此文件为系统的每个用户设置环境信息,当第一个用户登录时,该文件被执行.

并从/etc/profile.d目录的配置文件中搜集shell的设置.

/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取。有些linux版本中的/etc目录下已经没有了bashrc文件。

~/. pro每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该

文件仅仅执行一次!默认情况下,它设置一些环境变量,然后执行用户的.bashrc文件.

~/.bashrc:该文件包含专用于某个用户的bash shell的bash信息,当该用户登录时以及每次打开新的shell时,该文件被读取.

另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是”父子”关系.

当登入系统时候获得一个shell进程时,其读取环境设定档有三步
1.首先读入的是全局环境变量设定档/etc/profile,然后根据其内容读取额外的设定的文档,如
/etc/profile.d和/etc/inputrc
2.然后根据不同使用者帐号,去其家目录读取~/.bash_profile,如果这读取不了就读取~/.bash_login,这个也读取不了才会读取
~/.profile,这三个文档设定基本上是一样的,读取有优先关系
3.然后在根据用户帐号读取~/.bashrc

至于~/.profile与~/.bashrc的不区别
都具有个性化定制功能
~/.profile可以设定本用户专有的路径,环境变量,等,它只能登入的时候执行一次
~/.bashrc也是某用户专有设定文档,可以设定路径,命令别名,每次shell script的执行都会使用它一次

系统默认的环境变量值

通常系统预设了一个环境变量,我们可以通过下面的方式查看,那么你可以看到为什么能找到ls了,因为默认就包含了/usr/bin 这个目录。

[root@server ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

设置全局环境变量

1.opt 目录有个 testfile 的脚本

[root@server opt]# ls
acl  testfile

2.我们编辑/etc/profile文件,在末尾加入,该语句表示在现有的环境变量后在增加一个/opt 目录作为环境变量

PATH=$PATH:/opt

3.设置完保存后,记得重要的一步,要让环境变量生效,需要输入

[root@server usr]# source /etc/profile

4.然后,我们切换到/usr 目录,输入 testfile,可以看到/opt 目录的脚本也可以被执行了

[root@server opt]# cd /usr/
[root@server usr]# testfile
hello world!

现在,你不管在哪个目录执行 testfile 都可以了

设置用户变量

设置用户变量的方式和全局一样,只不过文件是修改对应用户的家目录下的配置文件。并且该环境变量只对自己有效。

别名

什么是别名

什么是别名,你可以把他理解为一个昵称,比如我的真名叫方文俊, 我给自己起了个昵称叫阿文,那么在系统中有一些命令特别长,并且经常使用一些常用的参数,我们就可以把改命令和参数打包给一个别名这样方便我们使用

我们看一个命令,ll,原命令是 ls -l 。ll 就是 ls -l 的别名

[root@server usr]# ll
total 136
dr-xr-xr-x.  2 root root 28672 Jun 24 23:12 bin
drwxr-xr-x.  2 root root     6 Nov  5  2016 etc
drwxr-xr-x.  2 root root     6 Nov  5  2016 games
drwxr-xr-x.  3 root root    23 Jun  3 07:51 include
dr-xr-xr-x. 28 root root  4096 Jun  3 07:54 lib
dr-xr-xr-x. 56 root root 32768 Jun 24 23:12 lib64
drwxr-xr-x. 20 root root  4096 Jun 24 23:12 libexec
drwxr-xr-x. 12 root root   131 Jun  3 07:50 local
dr-xr-xr-x.  2 root root 16384 Jun 27 01:17 sbin
drwxr-xr-x. 95 root root  4096 Jun 24 23:12 share
drwxr-xr-x.  4 root root    34 Jun  3 07:50 src
lrwxrwxrwx.  1 root root    10 Jun  3 07:50 tmp -> ../var/tmp

如何查看别名

输入 alias 就可以查看当前系统的所有别名

root@server usr]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

你会发现有 ll=’ls -l –color=auto’ 意思是列出目录后还自动给加上颜色,不同文件和目录用不同颜色区分,如下

如何设置别名

1.临时生效

设置别名要使用 alias 命令,比如我们希望把 vi 设置成 vim,如下所示,只要机器不断电,我们输入 vi,其实都是打开的 vim ,但是如果掉电或重启,则失效

[root@server usr]# alias vi='vim'
[root@server usr]# vi

2.永久生效

将上面的alias vi='vim' 写到/etc/bashrc 文件中即可永久生效

[root@server usr]# vi /etc/bashrc
[root@server usr]# source /etc/bashrc

/etc/bashrc 有条注释说的就是该文件用来定义函数和别名,哈哈。

[root@server usr]# cat /etc/bashrc | grep alias
# System wide functions and aliases
alias vi='vim'

而你看/etc/profile文件,明白了吧!

[root@server usr]# cat /etc/profile | grep alias
# Functions and aliases go in /etc/bashrc

使用 vnc 远程管理图形化桌面

安装

[root@localhost ~]#  yum install tigervnc-server

配置

1.拷贝模板

[root@localhost ~]# cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service

2.编辑

vi /etc/systemd/system/vncserver@:1.service

3.找到如下位置的内容,把 USER 替换成你自己的用户

[Service]
Type=forking
# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l <USER> -c "/usr/bin/vncserver %i"
PIDFile=/home/<USER>/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

例如

[Service]
Type=forking
# Clean any existing files in /tmp/.X11-unix environment
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l fwj -c "/usr/bin/vncserver %i"
PIDFile=/home/fwj/.vnc/%H%i.pid
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

然后设置防火墙

[root@localhost ~]# firewall-cmd --permanent --zone=public --add-service vnc-server
success
[root@localhost ~]# firewall-cmd --reload
success

然后切换到需要远程的用户下

[root@localhost ~]# su fwj
[fwj@localhost root]$ vncserver

You will require a password to access your desktops.

Password:
Verify:
xauth:  file /home/fwj/.Xauthority does not exist

New 'localhost.localdomain:1 (fwj)' desktop is localhost.localdomain:1

Creating default startup script /home/fwj/.vnc/xstartup
Starting applications specified in /home/fwj/.vnc/xstartup
Log file is /home/fwj/.vnc/localhost.localdomain:1.log

然后设置开机启动,并且启动进程

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl enable vncserver@:1.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vncserver@:1.service to /etc/systemd/system/vncserver@:1.service.
[root@localhost ~]# systemctl start vncserver@:1.service

这里最好重启下

[root@localhost ~]#reboot

然后

[root@localhost ~]# systemctl status vncserver@\:1.service
● vncserver@:1.service - Remote desktop service (VNC)
   Loaded: loaded (/etc/systemd/system/vncserver@:1.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2017-04-24 19:55:03 CST; 56s ago
  Process: 8411 ExecStart=/usr/sbin/runuser -l fwj -c /usr/bin/vncserver %i (code=exited, status=0/SUCCESS)
  Process: 8400 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill %i > /dev/null 2>&1 || : (code=exited, status=0/SUCCESS)
 Main PID: 7647 (Xvnc)
   CGroup: /system.slice/system-vncserver.slice/vncserver@:1.service
           ‣ 7647 /bin/Xvnc :1 -desktop localhost.localdomain:1 (fwj) -auth /home/fwj/.Xauthority -geometry 1024...

Apr 24 19:55:00 localhost.localdomain systemd[1]: Starting Remote desktop service (VNC)...
Apr 24 19:55:03 localhost.localdomain systemd[1]: Started Remote desktop service (VNC).

systemd

在 centos7 之前,系统默认都是通过 init 来产生其他进程的,而从7开始,使用 systemd。它是操作系统启动后的第一个进程,进程ID 是1

查看版本

[root@localhost ~]# systemctl --version
systemd 219
+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN

我使用的版本是219

检查systemd和systemctl的二进制

[root@localhost ~]# whereis systemd
systemd: /usr/lib/systemd /etc/systemd /usr/share/systemd /usr/share/man/man1/systemd.1.gz
[root@localhost ~]# whereis systemctl
systemctl: /usr/bin/systemctl /usr/share/man/man1/systemctl.1.gz

检查systemd是否运行

[root@localhost ~]# ps -eaf | grep systemd
root          1      0  0 07:37 ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root        534      1  0 07:37 ?        00:00:00 /usr/lib/systemd/systemd-journald
root        566      1  0 07:37 ?        00:00:00 /usr/lib/systemd/systemd-udevd
dbus        773      1  0 07:37 ?        00:00:00 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root        781      1  0 07:37 ?        00:00:00 /usr/lib/systemd/systemd-logind
root      11460  11389  0 08:08 pts/0    00:00:00 grep --color=auto systemd

注意:systemd是作为父进程(PID=1)运行的。在上面带(-e)参数的ps命令输出中,选择所有进程,(-a)选择除会话前导外的所有进程,并使用(-f)参数输出完整格式列表(即 -eaf)。

分析systemd启动进程

[root@localhost ~]# systemd-analyze 
Startup finished in 522ms (kernel) + 1.614s (initrd) + 52.184s (userspace) = 54.322s

可以看到在内核空间耗时了522ms,initrd系统引导耗时了1.614s,在用户空间耗时了 52.184s,总计耗时了54.322s

分析启动时各个进程花费的时间

[root@localhost ~]# systemd-analyze blame
         30.749s kdump.service
          7.130s NetworkManager-wait-online.service
          4.901s firewalld.service
          3.438s systemd-udev-settle.service
          2.331s polkit.service
          1.942s lvm2-pvscan@8:2.service
          1.874s lvm2-pvscan@8:21.service
          1.794s NetworkManager.service
          1.770s abrt-ccpp.service
          1.736s lvm2-pvscan@8:22.service
          1.654s lvm2-pvscan@8:23.service
          1.590s postfix.service
          1.021s tuned.service
           928ms lvm2-monitor.service
           865ms dev-mapper-cl\x2droot.device
           592ms nfs-mountd.service
           495ms network.service
           487ms rpc-statd.service
           475ms sshd.service
           474ms rsyslog.service
lines 1-20...skipping...

分析启动时的关键链

[root@localhost ~]# systemd-analyze critical-chain 
The time after the unit is active or started is printed after the "@" character.
The time the unit takes to start is printed after the "+" character.

multi-user.target @52.169s
└─postfix.service @21.402s +1.590s
  └─network.target @21.388s
    └─network.service @20.890s +495ms
      └─NetworkManager-wait-online.service @13.753s +7.130s
        └─NetworkManager.service @11.954s +1.794s
          └─firewalld.service @7.049s +4.901s
            └─polkit.service @4.662s +2.331s
              └─basic.target @4.493s
                └─sockets.target @4.492s
                  └─dbus.socket @4.492s
                    └─sysinit.target @4.480s
                      └─systemd-update-utmp.service @4.461s +19ms
                        └─auditd.service @4.392s +67ms
                          └─systemd-tmpfiles-setup.service @4.358s +27ms
                            └─rhel-import-state.service @4.280s +77ms
                              └─local-fs.target @4.279s
                                └─quotaon.service @3.008s +25ms
                                  └─systemd-quotacheck.service @3.005s +3ms
                                    └─mnt-ext4.mount @2.964s +35ms
                                      └─dev-disk-by\x2duuid-ddf037a9\x2ded53\x2d415d\x2da4e1

Systemctl接受服务(.service),挂载点(.mount),套接口(.socket)和设备(.device)作为单元。

列出所有可用单元’

[root@localhost ~]# systemctl list-unit-files 
UNIT FILE                                     STATE   
proc-sys-fs-binfmt_misc.automount             static  
dev-hugepages.mount                           static  
dev-mqueue.mount                              static  
proc-fs-nfsd.mount                            static  
proc-sys-fs-binfmt_misc.mount                 static  
sys-fs-fuse-connections.mount                 static  
sys-kernel-config.mount                       static  
sys-kernel-debug.mount                        static  
tmp.mount                                     disabled
var-lib-nfs-rpc_pipefs.mount                  static  
brandbot.path                                 disabled
systemd-ask-password-console.path             static  
systemd-ask-password-plymouth.path            static  
systemd-ask-password-wall.path                static  
session-6.scope                               static  
abrt-ccpp.service                             enabled 
abrt-oops.service                             enabled 
abrt-pstoreoops.service                       disabled
abrt-vmcore.service                           enabled 
abrt-xorg.service                             enabled 
abrtd.service                                 enabled 
arp-ethers.service                            disabled
atd.service                                   enabled 
auditd.service                                enabled 

列出所有运行中单元

[root@localhost ~]# systemctl list-units 
  UNIT                             LOAD   ACTIVE SUB       DESCRIPTION
  proc-sys-fs-binfmt_misc.automount loaded active waiting   Arbitrary Executable File Format
  sys-devices-pci0000:00-0000:00:07.1-ata2-host2-target2:0:0-2:0:0:0-block-sr0.device loaded
  sys-devices-pci0000:00-0000:00:10.0-host0-target0:0:0-0:0:0:0-block-sda-sda1.device loaded
  sys-devices-pci0000:00-0000:00:10.0-host0-target0:0:0-0:0:0:0-block-sda-sda2.device loaded
  sys-devices-pci0000:00-0000:00:10.0-host0-target0:0:0-0:0:0:0-block-sda.device loaded acti
  sys-devices-pci0000:00-0000:00:10.0-host0-target0:0:1-0:0:1:0-block-sdb-sdb1.device loaded
  sys-devices-pci0000:00-0000:00:10.0-host0-target0:0:1-0:0:1:0-block-sdb-sdb5.device loaded
  sys-devices-pci0000:00-0000:00:10.0-host0-target0:0:1-0:0:1:0-block-sdb-sdb6.device loaded
  sys-devices-pci0000:00-0000:00:10.0-host0-target0:0:1-0:0:1:0-block-sdb-sdb7.device loaded
  sys-devices-pci0000:00-0000:00:10.0-host0-target0:0:1-0:0:1:0-block-sdb.device loaded acti
  sys-devices-pci0000:00-0000:00:11.0-0000:02:01.0-net-ens33.device loaded active plugged   
  sys-devices-pci0000:00-0000:00:11.0-0000:02:02.0-net-ens34.device loaded active plugged   
  sys-devices-pci0000:00-0000:00:11.0-0000:02:03.0-sound-card0.device loaded active plugged 
  sys-devices-platform-serial8250-tty-ttyS1.device loaded active plugged   /sys/devices/plat
  sys-devices-platform-serial8250-tty-ttyS2.device loaded active plugged   /sys/devices/plat
  sys-devices-platform-serial8250-tty-ttyS3.device loaded active plugged   /sys/devices/plat
  sys-devices-pnp0-00:05-tty-ttyS0.device loaded active plugged   /sys/devices/pnp0/00:05/tt
  sys-devices-virtual-block-dm\x2d0.device loaded active plugged   /sys/devices/virtual/bloc
  sys-devices-virtual-block-dm\x2d1.device loaded active plugged   /sys/devices/virtual/bloc
  sys-devices-virtual-block-dm\x2d2.device loaded active plugged   /sys/devices/virtual/bloc
  sys-devices-virtual-block-dm\x2d4.device loaded active plugged   /sys/devices/virtual/bloc
  sys-devices-virtual-block-dm\x2d5.device loaded active plugged   /sys/devices/virtual/bloc
  sys-devices-virtual-block-md1.device loaded active plugged   /sys/devices/virtual/block/md
  sys-module-configfs.device       loaded active plugged   /sys/module/configfs
  sys-subsystem-net-devices-ens33.device loaded active plugged   82545EM Gigabit Ethernet Co
  sys-subsystem-net-devices-ens34.device loaded active plugged   82545EM Gigabit Ethernet Co
  -.mount                          loaded active mounted   /
  boot.mount                       loaded active mounted   /boot
  dev-hugepages.mount              loaded active mounted   Huge Pages File System
  dev-mqueue.mount                 loaded active mounted   POSIX Message Queue File System
● mnt-xfs.mount                    loaded failed failed    /mnt/xfs
  proc-fs-nfsd.mount               loaded active mounted   NFSD configuration filesystem
  run-user-0.mount                 loaded active mounted   /run/user/0
  sys-kernel-config.mount          loaded active mounted   Configuration File System
  sys-kernel-debug.mount           loaded active mounted   Debug File System
  var-lib-nfs-rpc_pipefs.mount     loaded active mounted   RPC Pipe File System

列出所有失败单元

[root@localhost ~]# systemctl --failed 
  UNIT          LOAD   ACTIVE SUB    DESCRIPTION
● mnt-xfs.mount loaded failed failed /mnt/xfs
● kdump.service loaded failed failed Crash recovery kernel arming

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

2 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.

检查某个单元(如 cron.service)是否启用

[root@localhost ~]# systemctl is-enabled crond.service 
enabled

检查某个单元或服务是否运行

[root@localhost ~]# systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2017-04-23 07:37:44 EDT; 41min ago
     Docs: man:firewalld(1)
 Main PID: 841 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─841 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Apr 23 07:37:39 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall.....
Apr 23 07:37:44 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall ...n.
Hint: Some lines were ellipsized, use -l to show in full.

列出所有服务(包括启用的和禁用的)

[root@localhost ~]# systemctl list-unit-files --type=service
UNIT FILE                                     STATE   
abrt-ccpp.service                             enabled 
abrt-oops.service                             enabled 
abrt-pstoreoops.service                       disabled
abrt-vmcore.service                           enabled 
abrt-xorg.service                             enabled 
abrtd.service                                 enabled 
arp-ethers.service                            disabled
atd.service                                   enabled 
auditd.service                                enabled 
auth-rpcgss-module.service                    static  
autovt@.service                               enabled 
blk-availability.service                      disabled
brandbot.service                              static  
chrony-dnssrv@.service                        static  
chrony-wait.service                           disabled
chronyd.service                               enabled 
console-getty.service                         disabled
console-shell.service                         disabled
container-getty@.service                      static  
cpupower.service                              disabled
crond.service                                 enabled 
dbus-org.fedoraproject.FirewallD1.service     enabled 
dbus-org.freedesktop.hostname1.service        static  
dbus-org.freedesktop.import1.service          static  
dbus-org.freedesktop.locale1.service          static  
dbus-org.freedesktop.login1.service           static  
dbus-org.freedesktop.machine1.service         static  
dbus-org.freedesktop.network1.service         bad     
dbus-org.freedesktop.NetworkManager.service   enabled 
dbus-org.freedesktop.nm-dispatcher.service    enabled 
dbus-org.freedesktop.timedate1.service        static  
dbus.service                                  static  
debug-shell.service                           disabled
dm-event.service                              disabled
dmraid-activation.service                     enabled 
dnsmasq.service                               disabled
dracut-cmdline.service                        static  
dracut-initqueue.service                      static  
dracut-mount.service                          static  
dracut-pre-mount.service                      static  
dracut-pre-pivot.service                      static  
dracut-pre-trigger.service                    static  
dracut-pre-udev.service                       static  
dracut-shutdown.service                       static  
lines 1-45

列出所有系统挂载点

[root@localhost ~]# systemctl list-unit-files --type=mount
UNIT FILE                     STATE   
dev-hugepages.mount           static  
dev-mqueue.mount              static  
proc-fs-nfsd.mount            static  
proc-sys-fs-binfmt_misc.mount static  
sys-fs-fuse-connections.mount static  
sys-kernel-config.mount       static  
sys-kernel-debug.mount        static  
tmp.mount                     disabled
var-lib-nfs-rpc_pipefs.mount  static  

9 unit files listed.

列出当前系统的运行等级

[root@localhost ~]# systemctl get-default 
multi-user.target

centos 6 在inttab,现在查看inittab文件,发现给出了修改命令

 [root@localhost ~]# cat /etc/inittab 
# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
#   

设置运行级别

  • Runlevel 0 : 关闭系统
  • Runlevel 1 : 救援?维护模式
  • Runlevel 3 : 多用户,无图形系统
  • Runlevel 4 : 多用户,无图形系统
  • Runlevel 5 : 多用户,图形化系统
  • Runlevel 6 : 关闭并重启机器

设置

[root@localhost ~]# systemctl set-default runlevel3.target 
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.

计划任务

at

一次性计划任务

1.创建一次性计划任务

[fwj@rhca ~]$ at 14:18
at> ping www.baidu.com >> /opt/baidu
at> ^C[fwj@rhca ~]$ at 14:18
at> ping www.baidu.com >> /opt/baidu<EOT>
job 3 at Sun Apr 23 14:18:00 2017

输入 ctrl+d 保存退出

2.查看

[fwj@rhca ~]$ atq
3    Sun Apr 23 14:18:00 2017 a fwj
[fwj@rhca ~]$

3.删除

[root@rhca ~]# atrm 4
[root@rhca ~]# atq

crontab

1.查看服务状态

[root@rhca ~]# systemctl status crond.service
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2017-04-23 14:16:31 CST; 4min 28s ago
 Main PID: 1173 (crond)
   CGroup: /system.slice/crond.service
           └─1173 /usr/sbin/crond -n

Apr 23 14:16:31 rhca systemd[1]: Started Command Scheduler.
Apr 23 14:16:31 rhca systemd[1]: Starting Command Scheduler...
Apr 23 14:16:31 rhca crond[1173]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 28% if used.)
Apr 23 14:16:34 rhca crond[1173]: (CRON) INFO (running with inotify support)

主要配置文件

  • 全局配置文件:/etc/crontab
  • 系统默认的设置: /etc/cron.*/
  • 用户定义的设置: /var/spool/cron/user

格式

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

计划任务格式

* * * * * user-name command to be executed

前面5列分别代表:

  • 第一列表示分 0-59
  • 第二列表示时 0-23
  • 第三列表示天 1-31
  • 第四列表示月 1-12
  • 第七列(可选)表示用户
  • 第八列 表示需要执行的具体脚本或命令的绝对路径

通配符

  • *表示任意时间
  • ,表示多个不连续的时间点
  • -表示一个连续的时间范围
  • /表示间隔的时间频率

查看列表

[root@rhca ~]# crontab -l
*/1 * * * * root /usr/bin/ping awen.com >> /opt/www
[root@rhca ~]# tail -f /var/log/cron
cron           cron-20170423

查看日志

[root@rhca ~]# tail -f /var/log/cron
Apr 23 14:44:26 rhca crontab[12788]: (root) BEGIN EDIT (root)
Apr 23 14:44:36 rhca crontab[12788]: (root) REPLACE (root)
Apr 23 14:44:36 rhca crontab[12788]: (root) END EDIT (root)
Apr 23 14:44:41 rhca crontab[12792]: (root) LIST (root)
Apr 23 14:44:44 rhca crontab[12794]: (root) BEGIN EDIT (root)
Apr 23 14:44:55 rhca crontab[12794]: (root) REPLACE (root)
Apr 23 14:44:55 rhca crontab[12794]: (root) END EDIT (root)
Apr 23 14:45:00 rhca crontab[12798]: (root) LIST (root)
Apr 23 14:45:01 rhca crond[1173]: (root) RELOAD (/var/spool/cron/root)
Apr 23 14:45:01 rhca CROND[12804]: (root) CMD (root /usr/bin/ping awen.com >> /opt/www)

案例

编辑计划任务

crontab -e

附:crontab规则详细实例

1.每天6:00执行

0 6 * * * root/root/root.sh

2.每周六凌晨4:00执行

0 4 * * 6 root /root/root.sh

3.每周六凌晨4:05执行

5 4 * * 6 root /root/root.sh

4.每周六凌晨4:15执行

15 4 * * 6 root /root/root.sh

5.每周六凌晨4:25执行

25 4 * * 6  root /root/root.sh

6.每周一到周五的11:41开始,每10分钟执行一次

1-59/10 12-23 * * 1-5 root /root/root.sh

7.每天的10:31开始,每隔2小时执行一次

31 10-23/2 * * * root /root/root.sh

Centos 7 编译内核

安装包

yum -y install ncurses-devel openssl-devel elfutils-libelf-devel

下载内核 解压

cd /usr/src/
wget -c https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.10.13.tar.xz
tar xf linux-4.10.13.tar.xz

编译

cp /boot/config-3.10.0-514.16.1.el7.x86_64 .config
make menuconfig 

弹出如下对话框,选择 Load(可以按 TAB 键选择),然后加载本地的.config文件

kernel.png!awen-290.9kB

找到

Networking Support —> Network options—> TCP: Advanced congestion algorithm 选择 BBR

BBR.png!awen-305kB

然后保存后退出,执行

make prepare
make -j 4 
make modules_install
make install

执行如下命令

awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

会出现如下内容

0 : CentOS Linux (4.10.13) 7 (Core)
1 : CentOS Linux (3.10.0-514.16.1.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-514.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-ea321ca5d6ef4103bbcfb9e680e0759e) 7 (Core)

设置第0项为开机默认启动项

grub2-set-default 0

重启查看

[root@localhost ~]# uname -r
4.10.13

Linux 中和网络相关命令

ifconfig

查IP

    [root@node-lvs-master vimrc]# ifconfig
    eth0      Link encap:Ethernet  HWaddr 00:0C:29:8C:65:5C  
              inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0 分别是IP地址 广播号 子网掩码
              inet6 addr: fe80::20c:29ff:fe8c:655c/64 Scope:Link ##IPV6的地址
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1 MTU值,度量值
              RX packets:4442 errors:0 dropped:0 overruns:0 frame:0 ##数据包收发状态
              屯溪 packets:3023 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:477890 (466.6 KiB)  屯溪 bytes:778624 (760.3 KiB) ##数据包收发总量

eth1      Link encap:Ethernet  HWaddr 00:50:56:26:3F:BF  
          inet addr:10.2.100.128  Bcast:10.2.100.255  Mask:255.255.255.0
          inet6 addr: fe80::250:56ff:fe26:3fbf/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:18456 errors:0 dropped:0 overruns:0 frame:0
          屯溪 packets:9730 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:27076657 (25.8 MiB)  屯溪 bytes:587726 (573.9 KiB)

lo        Link encap:Local Loopback   ##回环地址
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          屯溪 packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  屯溪 bytes:0 (0.0 b)

telnet

[root@node-lvs-master vimrc]# yum -y install telnet

测试端口通与不同

[root@node-lvs-master vimrc]# telnet 121.42.148.64 443
Trying 121.42.148.64...
Connected to 121.42.148.64.
Escape character is '^]'.
^C^Z^CConnection closed by foreign host.
[root@node-lvs-master vimrc]# ^C
[root@node-lvs-master vimrc]# telnet 121.42.148.64 445
Trying 121.42.148.64...
telnet: connect to address 121.42.148.64: Connection refused

netstat

描述:打印网络连接 路由表 网络接口的统计信息

参数

-s 显示各种协议数据统计信息

-n 把IP\端口\用户的ID、替换为主机 协议 用户名等信息
-p 显示进程名称和进程号
-l 仅仅显示正在监听的sockets接口信息
-u udp
-t tcp

[root@node-lvs-master vimrc]# netstat -nutlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:65422               0.0.0.0:*                   LISTEN      1319/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1398/master         
tcp        0      0 :::65422                    :::*                        LISTEN      1319/sshd           
tcp        0      0 ::1:25                      :::*                        LISTEN      1398/master    

Recv-Q 接收
Send-Q 发送

[root@node-lvs-master vimrc]# netstat -s
Ip:
    22984 total packets received
    0 forwarded
    0 incoming packets discarded
    22975 incoming packets delivered
    12881 requests sent out
Icmp:
    0 ICMP messages received
    0 input ICMP message failed.
    ICMP input histogram:
    0 ICMP messages sent
    0 ICMP messages failed
    ICMP output histogram:
Tcp:
    8 active connections openings
    1 passive connection openings
    1 failed connection attempts
    1 connection resets received
    1 connections established
    22488 segments received
    12846 segments send out
    1 segments retransmited
    0 bad segments received.
    9 resets sent
Udp:
    34 packets received
    0 packets to unknown port received.
    0 packet receive errors
    34 packets sent
UdpLite:
TcpExt:
    6 TCP sockets finished time wait in fast timer
    68 delayed acks sent
    19048 packets header predicted
    1211 acknowledgments not containing data received
    968 predicted acknowledgments
    0 TCP data loss events
    1 other TCP timeouts
IpExt:
    InNoRoutes: 9
    InBcastPkts: 453
    InOctets: 27316909
    OutOctets: 1160990

ss

和netstat差不多

[root@node-lvs-master vimrc]# ss -anut
Netid State      Recv-Q Send-Q                                                                                  Local Address:Port                                                                                    Peer Address:Port 
tcp   LISTEN     0      128                                                                                                :::65422                                                                                             :::*     
tcp   LISTEN     0      128                                                                                                 *:65422                                                                                              *:*     
tcp   LISTEN     0      100                                                                                               ::1:25                                                                                                :::*     
tcp   LISTEN     0      100                                                                                         127.0.0.1:25                                                                                                 *:*     
tcp   ESTAB      0      96                                                                                      192.168.1.100:65422                                                                                  192.168.1.241:64743 

route

路由相关设置和查看

[root@node-lvs-master vimrc]# route 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.2.100.0      *               255.255.255.0   U     0      0        0 eth1
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
link-local      *               255.255.0.0     U     1002   0        0 eth0
link-local      *               255.255.0.0     U     1003   0        0 eth1
default         10.2.100.2      0.0.0.0         UG    0      0        0 eth1

2.dns的修改

[fangwenjun@CTN-QD-247 ~]$ cat /etc/resolv.conf 
options timeout:1 attempts:1 rotate
nameserver 223.5.5.5
nameserver 223.6.6.6

traceroute

查看路由转发的路由表信息,默认使用UDP协议 -I 可以用icmp发送

[root@node-lvs-master ~]# traceroute ip

tracrote 的工作原理

Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由。
首先,tracert送出一个TTL是1的IP 数据包到目的地,当路径上的第一个路由器收到这个数据包时,它将TTL减1。此时,TTL变为0,所以该路由器会将此数据包丢掉,并送回一个「ICMP time exceeded」消息(包括发IP包的源地址,IP包的所有内容及路由器的IP地址),tracert 收到这个消息后,便知道这个路由器存在于这个路径上,接着tracert 再送出另一个TTL是2 的数据包,发现第2 个路由器…… tracert 每次将送出的数据包的TTL 加1来发现另一个路由器,这个重复的动作一直持续到某个数据包 抵达目的地。当数据包到达目的地后,该主机则不会送回ICMP time exceeded消息,一旦到达目的地,由于tracert通过UDP数据包向不常见端口(30000以上)发送数据包,因此会收到「ICMP port unreachable」消息,故可判断到达目的地。
tracert 有一个固定的时间等待响应(ICMP TTL到期消息)。如果这个时间过了,它将打印出一系列的*号表明:在这个路径上,这个设备不能在给定的时间内发出ICMP TTL到期消息的响应。然后,Tracert给TTL记数器加1,继续进行。

当你发起一个 traceroute 后,可以抓包看到,其中1、2、3、4……表示从本地到达目标网络所经过的路由数,记录按序列号从1开始,每个纪录就是一跳 ,每跳表示一个网关,我们看到每行有三个时间,单位是 ms,其实就是-q的默认参数。探测数据包向每个网关发送三个数据包后,网关响应后返回的时间;如果您用 traceroute -q 4 www.upyun.com ,表示向每个网关发送4个数据包。

➜  Downloads traceroute v0.api.upyun.com
    traceroute to v0.api.upyun.com (124.239.186.230), 64 hops max, 52 byte packets
     1  10.0.0.130 (10.0.0.130)  2.821 ms  1.959 ms  1.747 ms
     2  10.255.255.1 (10.255.255.1)  2.382 ms  2.339 ms  1.558 ms
     3  10.128.0.1 (10.128.0.1)  1.264 ms  1.987 ms  5.221 ms
     4  115.231.100.65 (115.231.100.65)  2.142 ms  4.050 ms  3.551 ms
     5  10.100.128.21 (10.100.128.21)  2.410 ms  3.159 ms  2.845 ms
     6  172.31.110.249 (172.31.110.249)  1.673 ms  1.761 ms  1.428 ms
     7  118.91.246.102 (118.91.246.102)  5.614 ms  2.450 ms  2.986 ms
     8  202.107.199.145 (202.107.199.145)  6.141 ms  4.062 ms  4.529 ms
     9  61.164.19.93 (61.164.19.93)  3.320 ms  3.010 ms  2.948 ms
    10  ppp57-124.ls.zj.cninfo.net (61.130.124.57)  8.456 ms
        220.191.143.161 (220.191.143.161)  6.432 ms
        61.164.22.141 (61.164.22.141)  7.250 ms
    11  202.97.85.93 (202.97.85.93)  26.383 ms
        202.97.79.57 (202.97.79.57)  29.644 ms
        202.97.79.157 (202.97.79.157)  39.115 ms
    12  * * *
    13  * 27.129.1.162 (27.129.1.162)  41.755 ms *
    14  27.129.5.174 (27.129.5.174)  51.906 ms  49.620 ms
        27.129.5.254 (27.129.5.254)  339.157 ms
    15  27.129.5.174 (27.129.5.174)  44.603 ms
        222.223.243.30 (222.223.243.30)  42.159 ms
        222.223.243.10 (222.223.243.10)  60.303 ms
    16  222.223.243.10 (222.223.243.10)  73.462 ms * *
    17  * * *
    18  * * *
    19  * * *
    20  * * *
    21  * * *
    22  * * *
    23  * * *
    24  * * *

命令参数

-d 使用Socket层级的排错功能。
-f 设置第一个检测数据包的存活数值TTL的大小。
-F 设置勿离断位。
-g 设置来源路由网关,最多可设置8个。
-i 使用指定的网络界面送出数据包。
-I 使用ICMP回应取代UDP资料信息。
-m 设置检测数据包的最大存活数值TTL的大小。
-n 直接使用IP地址而非主机名称。
-p 设置UDP传输协议的通信端口。
-r 忽略普通的Routing Table,直接将数据包送到远端主机上。
-s 设置本地主机送出数据包的IP地址。
-t 设置检测数据包的TOS数值。
-v 详细显示指令的执行过程。
-w 设置等待远端主机回报的时间。
-x 开启或关闭数据包的正确性检验。

我们可以抓包看到,其实底层是通过 icmp 协议实现的,参考维基百科
icmp.png!awen

ping_dest.png!awen

tracert

格式:
tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout] target_name
参数说明:
tracert [-d] [-h maximum_hops] [-j computer-list] [-w timeout] target_name
该诊断实用程序通过向目的地发送具有不同生存时间 (TL) 的 Internet 控制信息协议 (CMP) 回应报文,以确定至目的地的路由。路径上的每个路由器都要在转发该 ICMP 回应报文之前将其 TTL 值至少减 1,因此 TTL 是有效的跳转计数。当报文的 TTL 值减少到 0 时,路由器向源系统发回 ICMP 超时信息。通过发送 TTL 为 1 的第一个回应报文并且在随后的发送中每次将 TTL 值加 1,直到目标响应或达到最大 TTL 值,Tracert 可以确定路由。通过检查中间路由器发发回的 ICMP 超时 (ime Exceeded) 信息,可以确定路由器。注意,有些路由器“安静”地丢弃生存时间 (TLS) 过期的报文并且对 tracert 无效。
参数:
-d 指定不对计算机名解析地址。
-h maximum_hops 指定查找目标的跳转的最大数目。
-jcomputer-list 指定在 computer-list 中松散源路由。
-w timeout 等待由 timeout 对每个应答指定的毫秒数。
target_name 目标计算机的名称。

icmp 协议

ICMP是在RFC 792中定义的互联网协议族之一。通常用于返回的错误信息或是分析路由。ICMP错误消息总是包括了源数据并返回给发送者。 ICMP错误消息的例子之一是TTL值过期。每个路由器在转发数据报的时候都会把IP包头中的TTL值减一。如果TTL值为0,“TTL在传输中过期”的消息将会回报给源地址。 每个ICMP消息都是直接封装在一个IP数据包中的,因此,和UDP一样,ICMP是不可靠的。
虽然ICMP是包含在IP数据包中的,但是对ICMP消息通常会特殊处理,会和一般IP数据包的处理不同,而不是作为IP的一个子协议来处理。在很多时候,需要去查看ICMP消息的内容,然后发送适当的错误消息到那个原来产生IP数据包的程序,即那个导致ICMP讯息被传送的IP数据包。
很多常用的工具是基于ICMP消息的。traceroute是通过发送包含有特殊的TTL的包,然后接收ICMP超时消息和目标不可达消息来实现的。ping则是用ICMP的”Echo request”(类别代码:8)和”Echo reply”(类别代码:0)消息来实现的。
pingicmp.png!awen

ICMP部分的结构

ICMP报头从IP报头的第160位开始(除非使用了IP报头的可选部分)报头参考维基百科

Type - ICMP的类型,标识生成的错误报文;
Code - 进一步划分ICMP的类型,该字段用来查找产生错误的原因.;例如,ICMP的目标不可达类型可以把这个位设为1至15等来表示不同的意思。
Checksum - 校验码部分,这个字段包含有从ICMP报头和数据部分计算得来的,用于检查错误的数据,其中此校验码字段的值视为0。
ID - 这个字段包含了ID值,在Echo Reply类型的消息中要返回这个字段。
Sequence - 这个字段包含一个序号,同样要在Echo Reply类型的消息中要返回这个字段。

反馈消息说明

参考维基百科

dig

host nslookup 等需要安装,默认最小化安装操作系统没有

  1. 安装

    yum install bind-utilsyum install bind-utils    
    

2.使用

[root@node-lvs-master ~]# dig awen.me

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.3 <<>> awen.me
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61333
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;awen.me.                       IN      A

;; ANSWER SECTION:
awen.me.                600     IN      CNAME   fangwenjun.b0.aicdn.com.
fangwenjun.b0.aicdn.com. 1497   IN      CNAME   ctn.b9.aicdn.com.
ctn.b9.aicdn.com.       60      IN      A       183.158.35.58
ctn.b9.aicdn.com.       60      IN      A       183.158.35.57
ctn.b9.aicdn.com.       60      IN      A       183.158.35.59
ctn.b9.aicdn.com.       60      IN      A       183.158.35.60

;; Query time: 30 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Sat Jan  7 10:42:31 2017
;; MSG SIZE  rcvd: 147

2.@可以跟dns,可以判断解析是否生效

[root@node-lvs-master ~]# dig awen.me @8.8.8.8

3.查看邮件解析

[root@node-lvs-master ~]# dig fangwenjun.com MX

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.47.rc1.el6_8.3 <<>> fangwenjun.com MX
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36288
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;fangwenjun.com.                        IN      MX

;; ANSWER SECTION:
fangwenjun.com.         600     IN      MX      10 mxdomain.qq.com.

;; Query time: 30 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Sat Jan  7 10:45:24 2017
;; MSG SIZE  rcvd: 60

DNS常用术语

  1. 记录类型

A记录:
将域名指向一个IPv4地址(例如:10.10.10.10),需要增加A记录
CNAME记录:
如果将域名指向一个域名,实现与被指向域名相同的访问效果,需要增加CNAME记录
MX记录:
建立电子邮箱服务,将指向邮件服务器地址,需要设置MX记录
NS记录:
域名解析服务器记录,如果要将子域名指定某个域名服务器来解析,需要设置NS记录
TXT记录:
可任意填写(可为空),通常用做SPF记录(反垃圾邮件)使用
AAAA记录:
将主机名(或域名)指向一个IPv6地址(例如:ff03:0:0:0:0:0:0:c1),需要添加AAAA记录
SRV记录:
记录了哪台计算机提供了哪个服务。格式为:服务的名字.协议的类型(例如:_example-server._tcp)

22.主机记录
www :
将域名解析为www.example.com,填写www;
@ :
将域名解析为example.com(不带www),填写@或者不填写;
mail :
将域名解析为mail.example.com,通常用于解析邮箱服务器;


  • 泛解析,所有子域名均被解析到统一地址(除单独设置的子域名解析);
    二级域名 :
    如:mail.example.com或abc.example.com,填写mail或abc;
    手机网站 :
    如:m.example.com,填写m。

mtr

MTR是Linux平台上一款非常好用的网络诊断工具,集成了traceroute、ping、nslookup的功能,用于诊断网络状态非常有用。下面请看简单介绍

安装

[root@node-lvs-master ~]# yum -y install mtr

使用

第一列(Host):IP地址和域名,按n键可以切换IP和域名
第二列(Loss%):丢包率
第三列(Snt):设置每秒发送数据包的数量,默认值是10 可以通过参数-c来指定
第四列(Last):最近一次的PING值
第五、六、七列(Avg、Best、Wrst):分别是PING的平均、最好、最差值
第八列(StDev):标准偏差

网卡设置

1.编辑配置文件

[root@node-lvs-master vimrc]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
UUID=82fc9357-d760-4986-8e1d-c7aef84dd2dd
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
HWADDR=00:0C:29:8C:65:5C
IPADDR=192.168.1.100
PREFIX=24
GATEWAY=192.168.1.1
DNS1=192.168.1.1
DNS2= 114.114.114.114
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"

wget

通过 wget 可以下载 ftp http 协议的相关资源,常用的的有

1.-c 参数断点下载

wget -c http://mirrors.163.com/centos/7.3.1611/isos/x86_64/CentOS-7-x86_64-DVD-1611.iso

还有很多功能,详细读下 wget 的手册和help 参数

tcpdump 抓包分析

tcpdump 是一款开源的命令行数据包分析获取软件,它有着丰富的功能,通常我们在 linux 服务器上使用他进行网络故障的分析,可以输出 wireshark 支持的 cap 文件打开查看。

tcpdump可以指定关键字加各种条件判断进行过滤。
第一种是关于类型的关键字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明 202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host.

第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则缺省是src or dst关键字。

第三种是协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定 的网络协议,实际上它是”ether”的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和 分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。

除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,greater,还有三种逻辑运算,取非运算是 ‘not ‘ ‘! ‘, 与运算是’and’,’&&;或运算 是’or’ ,’||’;这些关键字可以组合起来构成强大的组合条件来满足人们的需要。

安装

1.centos

yum -y install tcpdump

2.ubuntu

sudo apt-get install tcpdump

案例

tcpdump -i eth1 -c 10

-i 指定接口
-c 只打印10个数据包

其中

10 packets captured 表示捕捉数据包的数量
10 packets received by filter 过滤后所得的报数
0 packets dropped by kernel 被内核丢弃的包数量

tcpdump.png!awen

tcpdump -i eth1 -c 10 host 115.231.100.10

host ip_address 只输出指定 host 的数据包

tcpdump -i eth1 -c 10 host 115.231.100.10 -s0 -w /home/fangwenjun/tcp.pcap

保存为 wireshark 可以打开的格式,-s0 表示输出完整的报文头

tcpdump host 210.27.48.1 and / (210.27.48.2 or 210.27.48.3 /)

截取 210.27.48.1 210.27.48.2 210.27.48.3 的数据包

tcpdump -i eth1 host 115.231.100.10 -s0 -c 100 and tcp port 80 or 443

打印指定host 的80和443端口的数据包

17:05:26.738783 IP spider-141-8-142-49.yandex.com.44018 > 121.42.148.6.https: Flags [.], ack 1466937074, win 122, options [nop,nop,TS val 3216080543 ecr 96181242], length 0
17:05:26.738831 IP spider-141-8-142-49.yandex.com.44018 > 121.42.148.6.https: Flags [.], ack 1399, win 132, options [nop,nop,TS val 3216080543 ecr 96181242], length 0
17:05:26.738839 IP spider-141-8-142-49.yandex.com.44018 > 121.42.148.6.https: Flags [.], ack 1510, win 132, options [nop,nop,TS val 3216080543 ecr 96181242], length 0

如果加上-nn 参数则不会解析常用端口所对应的协议,例如 http 会变成80 https 会变成443

tcpdump -i eth1 host 115.231.100.10 -s0 -c 100 and tcp port 80 or 443 -nn



tcpdump -i eth1 host 115.231.100.10 -s0 -c 100 and tcp port 80 or 443 -nn -q

-q 参数会显示比较短的数据包信息,如下

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
17:11:03.670618 IP 115.231.100.10.62036 > 121.42.148.6.443: tcp 77
17:11:03.670670 IP 121.42.148.6.443 > 115.231.100.10.62036: tcp 0
17:11:03.670681 IP 115.231.100.10.62036 > 121.42.148.6.443: tcp 46
17:11:03.670687 IP 121.42.148.6.443 > 115.231.100.10.62036: tcp 0
17:11:03.670956 IP 121.42.148.6.443 > 115.231.100.10.62036: tcp 46
17:11:03.698967 IP 115.231.100.10.62036 > 121.42.148.6.443: tcp 0

然后,我们看-e 参数

tcpdump -i eth1 host 115.231.100.10 -s0 -c 100 and tcp port 80 or 443 -nn -qe

-e 参数会使用二层的 mac 地址输出信息,例如

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
 listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
 17:13:53.002550 ee:ff:ff:ff:ff:ff > 00:16:3e:00:29:6d, IPv4, length 143: 115.231.100.10.62036 > 121.42.148.6.443: tcp 77
 17:13:53.002731 ee:ff:ff:ff:ff:ff > 00:16:3e:00:29:6d, IPv4, length 112: 115.231.100.10.62036 > 121.42.148.6443: tcp 46

我们继续看

tcpdump -i eth1 host 115.231.100.106 -s0 -c 10 and tcp port 80 or 443 -nn -X

-X参数,会打印16位进制(hex)以及 ASCII 的封包內容

抓取指定主机 80端口 数据包 s0 输出完整报头

root@ubuntu-512mb-lon1-01:~# tcpdump -i eth0 -nnXSs 0 'host 43.230.89.190 and port 80'  -w 3.cap
 tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes

使用curl命令操作HTTP REST

HTTP协议的方法

POST:发送请求的实体内容
GET:获取资源
HEAD:获取头部信息
PUT:上传
DELETE:删除
TRACE:追踪
OPTION:询问支持的方法
CONNECT:用隧道协议连接代理

还有很多,不太常用到

CURL命令

获取空间使用情况: (返回的数值单位为B)

curl http://v0.api.upyun.com/ceshi-files/?usage -u operator:passwd -v

获取目录文件列表:

curl http://v0.api.upyun.com/ceshi-files/ -u operator:passwd -v

获取文件信息

curl http://v0.api.upyun.com/ceshi-files/web/index.html -X HEAD -u operator:passwd -v

创建目录

curl http://v0.api.upyun.com/ceshi-files/dir/ -H 'folder:true' -H 'mkdir:true' -X POST -u operator:passwd -v

删除目录

curl http://v0.api.upyun.com/ceshi-files/dir/ -X DELETE -u operator:passwd -v

上传文件

curl -T /tmpmple.jpg!awen http://v0.api.upyun.com/ceshi-files/aa.jpg!awen -u operator:passwd -v

下载文件

curl http://v0.api.upyun.com/ceshi-files/aa.jpg!awen -u operator:passwd -v -o /tmp.jpg!awen

删除文件

curl http://v0.api.upyun.com/ceshi-files/aa.jpg!awen -X DELETE -u operator:passwd -v

指定某个节点去访问

curl -I http://file201503.b0.upaiyun.com/linux.png!awen -x 60.211.204.130:80 -v

将文件保存到本地

curl -o page.html https://awen.me

保存cookie信息,-D是把http的response里面的cookie信息存到一个特别的文件中去

curl -o page.html -D cookie1.txt  https://awen.me

这样下次就可以这样使用cookie信息

curl  -o page1.html -D cookie2.txt -b cookie1.txt https://www.awen.me

设置referer

curl -e "abc.com" https://awen.me 

curl -H"referer:abc.com" https://awen.me

指定user-agent

curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 1.1.1.1:1080 -o page.html -D cookie0001.txt https://awen.me

或 -H 指定

下载

$ curl -O http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].jpg!awen

这样产生的下载,就是

~zzh/001.jpg!awen

~zzh/002.jpg!awen

...

~zzh/201.jpg!awen

~nick/001.jpg!awen

~nick/002.jpg!awen

...

~nick/201.jpg!awen

由于zzh/nick下的文件名都是001,002…,201,下载下来的文件重名,后面的把前面的文件都给覆盖掉了 ~

没关系,我们还有更狠的!

$ curl -o #2_#1.jpg!awen http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].jpg!awen

GET

GET模式什么option都不用,只需要把变量写在url里面就可以了比如:

$ curl http://www.linuxidc.com/login.cgi?user=nickwolfe&password=12345

POST

模式的option则是 -d

比如

$ curl -d "user=nickwolfe&password=12345" http://www.linuxidc.com/login.cgi

这样一个HTTP表单,我们要用curl进行模拟,就该是这样的语法:

$ curl -F upload=@localfile -F nick=go http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi

具体怎么用还是curl –help吧

[root@node-lvs-master ~]# curl --help

利用iperf3 测试网络性能

安装

yum -y install iperf3

使用

iperf 舰艇端口是tcp 50001 iperf3 监听端口是5201,分为server模式和client模式

参数

參數說明

    -s 啟動server模式,例如:iperf -s
    -c 啟動client模式,命令後接server的位址,例如:iperf -c 192.168.1.3

    通用參數

    -f [k|m|K|M] 報告結果顯示的單位,以Kbits, Mbits, KBytes, MBytes,例如:iperf -c 192.168.1.3 -f K
    -i sec 報告顯示的時間間隔(以秒為單位),例如:iperf -c 192.168.1.3 -i 2
    -l [KM] 緩衝區大小,預設是8KB,例如:iperf -c 192.168.1.3 -l 16
    -m 顯示MTU最大值
    -o 將報告與錯誤信息輸出到檔案,例如:iperf -c 192.168.1.3 -o c:\iperf-log.txt
    -p server使用的連接埠或client使用的連接埠,兩端連接埠要一致,例如:iperf -s -p 9999
    -u 使用udp通訊規格
    -w 指定TCP框架大小,預設是8KB
    -B 綁定一個主機地址,可以是介面或是廣播位址,當主機端同時有很多位址時才需要綁定
    -C 相容舊版本(兩端版本不致時使用)
    -M 設定TCP封包的最大MTU值
    -N 設定TCP不延時
    -V 傳輸ipv6資料封包


    server專用

    -D 背景服務方式運行,例如:iperf -s -D
    -U 使用單一執行緒使用UDp模式


    client專用

    -b UDP測試專用,可以設定每秒傳送的速度
    -d 同時進行雙向傳輸測試
    -n 指定傳輸的大小,例如: iperf -c 192.168.1.3 -n 100000
    -r 單獨進行雙向傳輸測試
    -t 測試時間長度,預設10秒,例如: iperf -c 192.168.1.3 -t 5
    -F 使用指定檔案來傳輸
    -I 使用stdin方式當做傳輸內容
    -T 指定ttl值

案例

1.启动服务端

# iperf3 -s

2.然后在客户端运行

iperf –c 192.168.3.58 –w 100M –t 120 –i 10

ssh 服务详解

之前简单说过如何连接 ssh,现在详细说下 ssh 服务的配置。

有密码的连接

ssh username@ip [-p port]

ssh 无密码连接

1.创建ssh密钥,通过ssh-keygen -t rsa 可以创建一个2048位的密钥

[root@node-lvs-master ~]# ssh-keygen -t rsa
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:
02:2b:c6:c7:f8:e0:1b:47:3b:f4:b7:3a:97:92:26:88 root@node-lvs-master
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|    .            |
| . o o           |
|  * * . S        |
| o B o .         |
| .o.= ....       |
|E .+..=.o.       |
|  .  o.=.        |
+-----------------+

2.在主目录的~/.ssh目录下游2个文件id_rsa 是私钥,*.pub是公钥

[root@node-lvs-master ~]# cd ~/.ssh/
[root@node-lvs-master .ssh]# ls
id_rsa  id_rsa.pub

3.远程到其他服务器,我们可以copy公钥过去,我们需要先安装openssh-clients

[root@node-lvs-master .ssh]# yum -y install openssh-clients

4.然后执行ssh-copy-id username@ip -p port 输入密码后,类似如下

[root@node-lvs-master .ssh]# ssh-copy-id root@10.2.100.129
The authenticity of host '10.2.100.129 (10.2.100.129)' can't be established.
RSA key fingerprint is f3:57:c2:9c:1a:b0:7a:2a:7d:cc:d1:7e:d5:eb:13:0a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.2.100.129' (RSA) to the list of known hosts.
root@10.2.100.129's password: 
Now try logging into the machine, with "ssh 'root@10.2.100.129'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

5.之后,你要远程目标服务器,就可以

[root@node-lvs-master .ssh]# ssh root@10.2.100.129
Last login: Fri Jan  6 19:02:51 2017 from 10.2.100.1
[root@node-nginx-1 ~]# 

配置ssh服务

编辑/etc/ssh/sshd_config配置文件

[root@node-lvs-master .ssh]# cat /etc/ssh/sshd_config 
#       $OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options change a
# default value.

Port 65422 #修改端口
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

# Disable legacy (protocol version 1) support in the server for new
# installations. In future the default will change to require explicit
# activation of protocol 1
Protocol 2 #ssh的版本

# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key
# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key

# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h
#ServerKeyBits 1024

# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
#LogLevel INFO

# Authentication:

#LoginGraceTime 2m
PermitRootLogin no  # 禁止或允许root用户登录 yes为运行 no为禁止
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

#RSAAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile     .ssh/authorized_keys # 在.ssh中执行cat id_rsa.pub >>authorized_keys
#AuthorizedKeysCommand none
#AuthorizedKeysCommandRunAs nobody

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#RhostsRSAAuthentication no
# similar for protocol version 2
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# RhostsRSAAuthentication and HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication yes #禁止或运行密码登录

# Change to no to disable s/key passwords
#ChallengeResponseAuthentication yes
ChallengeResponseAuthentication no

# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
#KerberosUseKuserok yes

# GSSAPI options
#GSSAPIAuthentication no
GSSAPIAuthentication yes
#GSSAPICleanupCredentials yes
GSSAPICleanupCredentials yes
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no

# Set this to 'yes' to enable PAM authentication, account processing, 
# and session processing. If this is enabled, PAM authentication will 
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication.  Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
#UsePAM no
UsePAM yes

# Accept locale-related environment variables
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS

#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
#X11Forwarding no
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#UsePrivilegeSeparation yes
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#ShowPatchLevel no
#UseDNS yes
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none

# no default banner path
#Banner none

# override default of no subsystems
Subsystem       sftp    /usr/libexec/openssh/sftp-server

# Example of overriding settings on a per-user basis
#Match User anoncvs
#       X11Forwarding no
#       AllowTcpForwarding no
#       ForceCommand cvs server

重启

/etc/init.d/sshd [restart|start|stop]

NFS服务

nfs 是一种网络文件服务,用来在 linux 主机之间进行文件共享

安装

[root@rhca html]# yum -y install nfs-utils
[root@230-101 ~]# systemctl status nfs.service
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
[root@230-101 ~]# systemctl start nfs.service
[root@230-101 ~]# systemctl status nfs.service
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: active (exited) since Sun 2017-04-23 03:51:15 EDT; 2s ago
  Process: 11081 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
  Process: 11080 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
 Main PID: 11081 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service

Apr 23 03:51:15 230-101 systemd[1]: Starting NFS server and services...
Apr 23 03:51:15 230-101 systemd[1]: Started NFS server and services.

配置

1.编辑配置文件,允许172.16.230网段访问。

[root@rhca html]# cat /etc/exports
/usr/local/nginx/html 172.16.230.*(sync,rw)

2.使其生效

[root@rhca html]# exportfs -rv
exporting 172.16.230.*:/usr/local/nginx/html

服务端也关闭端口和selinux

3.另一台主机挂载

[root@230-101 mnt]# setenforce 0
[root@230-101 mnt]# systemctl stop firewalld.service
[root@230-101 mnt]# mount -t nfs 172.16.230.100:/usr/local/nginx/html /mnt/
[root@230-101 mnt]# cd /mnt/
[root@230-101 mnt]# ls
CentOS_BuildTag  EULA  images    LiveOS    repodata              RPM-GPG-KEY-CentOS-Testing-7
EFI              GPL   isolinux  Packages  RPM-GPG-KEY-CentOS-7  TRANS.TBL

参数

  • ro 只读
  • sync 所以操作返回前必须已经写入磁盘
  • wdelay 延迟写操作,等更多写操作一起执行
  • rw 读写共享
  • async 操作延迟写入硬盘
  • no_wdelay 关闭延迟,需要与 sync 一起使用
  • no_root_squash 关闭 root_squash

写入文件测试

写入文件需要 nfs 服务端挂载的目录其他人有读写的权限。

[root@rhca nginx]# ll
total 4
drwx------. 2 nobody root    6 Apr 23 10:44 client_body_temp
drwxr-xr-x. 2 root   root 4096 Apr 23 10:52 conf
drwx------. 2 nobody root    6 Apr 23 10:44 fastcgi_temp
drwxr-xr-x. 8 root   root  220 Apr 23 15:43 html
drwxr-xr-x. 2 root   root   41 Apr 23 14:16 logs
drwx------. 2 nobody root    6 Apr 23 10:44 proxy_temp
drwxr-xr-x. 2 root   root   19 Apr 23 10:36 sbin
drwx------. 2 nobody root    6 Apr 23 10:44 scgi_temp
drwx------. 2 nobody root    6 Apr 23 10:44 uwsgi_temp
[root@rhca nginx]# chmod o+w html/
[root@rhca nginx]# ll
total 4
drwx------. 2 nobody root    6 Apr 23 10:44 client_body_temp
drwxr-xr-x. 2 root   root 4096 Apr 23 10:52 conf
drwx------. 2 nobody root    6 Apr 23 10:44 fastcgi_temp
drwxr-xrwx. 8 root   root  220 Apr 23 15:45 html
drwxr-xr-x. 2 root   root   41 Apr 23 14:16 logs
drwx------. 2 nobody root    6 Apr 23 10:44 proxy_temp
drwxr-xr-x. 2 root   root   19 Apr 23 10:36 sbin
drwx------. 2 nobody root    6 Apr 23 10:44 scgi_temp
drwx------. 2 nobody root    6 Apr 23 10:44 uwsgi_temp

然后,你也可赋予nfsnobody用户和组权限

[root@rhca nginx]# setfacl -m user:nfsnobody:rwx html/
[root@rhca nginx]# setfacl -m group:nfsnobody:rwx html/
[root@rhca nginx]# chmod o-w html/
[root@rhca nginx]# ll
total 8
drwx------. 2 nobody root    6 Apr 23 10:44 client_body_temp
drwxr-xr-x. 2 root   root 4096 Apr 23 10:52 conf
drwx------. 2 nobody root    6 Apr 23 10:44 fastcgi_temp
drwxrwxr-x+ 8 root   root  229 Apr 23 16:03 html
drwxr-xr-x. 2 root   root   41 Apr 23 14:16 logs
drwx------. 2 nobody root    6 Apr 23 10:44 proxy_temp
drwxr-xr-x. 2 root   root   19 Apr 23 10:36 sbin
drwx------. 2 nobody root    6 Apr 23 10:44 scgi_temp
drwx------. 2 nobody root    6 Apr 23 10:44 uwsgi_temp

然后,客户端挂载后

[root@230-101 mnt]# touch a
[root@230-101 mnt]# mkdir b
[root@230-101 mnt]#

服务端查看

[root@rhca html]# ll
total 308
-rw-r--r--. 1 nfsnobody nfsnobody      0 Apr 23 15:46 a
drwxr-xr-x. 2 nfsnobody nfsnobody      6 Apr 23 15:46 b

永久挂载

[root@230-101 ~]# tail -1 /etc/fstab
172.16.230.100:/usr/local/nginx/html /mnt nfs defaults 0 0

显示 NFS 挂载的目录

[root@rhca nginx]# showmount -e
Export list for rhca:
/var/ftp/pub          172.16.230.*
/usr/local/nginx/html 172.16.230.101

停止共享

1.停止

[root@rhca nginx]# exportfs -auv

2.客户端提示无权限

[root@230-101 /]# cd mnt
-bash: cd: mnt: Permission denied
[root@230-101 /]# umount /mnt
[root@230-101 /]# cd /mnt/
[root@230-101 mnt]# ls

故障

挂载后报错

[root@desktop ~]# mount -t nfs 172.10.100.128:/smbu/ /mnt/nfs/
mount.nfs: access denied by server while mounting 172.10.100.128:/smbu/

服务器端

[root@server ~]# exportfs -rv
exporting 172.10.100.*:/smbu

服务器和客户端都是172.10.100.0网段的,服务器 IP地址 172.10.100.128 客户端 172.10.100.131,网络肯定是可以到达的。

解决办法

将网段改成 XXX.XXX.XXX.XXX/XX 这个样

[root@server ~]# exportfs -rv
exporting 172.10.100.0/24:/smbu

然后在挂载

[root@desktop ~]# mount -t nfs 172.10.100.128:/smbu /mnt/nfs/    

为什么会有这样的问题,因为 centos7 使用的 nfs 版本默认是4,可能存在不兼容的问题吧。

[root@desktop ~]# mount -t nfs 172.10.100.128:/smbu /mnt/nfs/ -v
mount.nfs: timeout set for Sun May 7 01:38:14 2017
mount.nfs: trying text-based options ‘vers=4,addr=172.10.100.128,clientaddr=172.10.100.131’

指定版本挂载

-v 参数打印详细的信息, -o 指定其他选项 vers=3 指定以 nfs 3 挂载

[root@desktop ~]# mount -t nfs -v -o vers=3 172.10.100.128:/smbu /mnt/nfs/
mount.nfs: timeout set for Sun May  7 01:40:09 2017
mount.nfs: trying text-based options 'vers=3,addr=172.10.100.128'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 172.10.100.128 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 172.10.100.128 prog 100005 vers 3 prot UDP port 20048

如果希望开机启动以 nfs 3 版本运行,需要在/etc/fstab中添加

172.10.100.128:/smbu /mnt/nfs nfs defaults,nfsvers=3 0 0

然后 mount -a 后查看

172.10.100.128:/smbu on /mnt/nfs type nfs (rw,relatime,vers=3,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=172.10.100.128,mountvers=3,mountport=20048,mountproto=udp,local_lock=none,addr=172.10.100.128)

vsftp服务

安装

[root@vm-50-156 ~]# yum -y install vsftpd


[root@vm-50-156 ~]# systemctl enable vsftpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.

客户端连接

1.安装

sudo apt-get install ftp

2.登陆

pi@raspberrypi:~ $ ftp 192.168.50.156
Connected to 192.168.50.156.
220 (vsFTPd 3.0.2)
Name (192.168.50.156:pi): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

或者

pi@raspberrypi:~ $ ftp 192.168.50.156
Connected to 192.168.50.156.
220 (vsFTPd 3.0.2)
Name (192.168.50.156:pi): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

匿名用户登陆

但是目前匿名用户只能访问,下载文件 不能上传,需要设置配置文件

ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x    2 0        0              15 May 06 05:47 pub
226 Directory send OK.
ftp> put test.txt
local: test.txt remote: test.txt
200 PORT command successful. Consider using PASV.
550 Permission denied.

配置文件修改

# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=YES
#
# Uncomment this to allow local users to log in.
# When SELinux is enforcing check for SE bool ftp_home_dir
local_enable=YES
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES

    anon_upload_enable=YES #允许上传
#
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
anon_mkdir_write_enable=YES #允许创建和写入文件        

重启服务,上传测试

ftp> put test.txt
local: test.txt remote: test.txt
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
19 bytes sent in 0.00 secs (240.9700 kB/s)
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 0        0               4 May 06 05:47 a
-rw-------    1 14       50             19 May 06 05:59 test.txt
226 Directory send OK.
ftp>    

本地用户登陆

1.创建用户

[root@vm-50-156 ~]# useradd ftp1 -s /sbin/nologin -g ftp
[root@vm-50-156 ~]# passwd ftp1
Changing password for user ftp1.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.

2.然后客户端登陆

pi@raspberrypi:~/ftp $ ftp 192.168.50.156
Connected to 192.168.50.156.
220 (vsFTPd 3.0.2)
Name (192.168.50.156:pi): ftp1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/ftp1"
ftp>    

禁止登陆

1.全局禁止

local_enable=YES //改为 NO

2.配置文件禁止

  • ftpusers 黑名单 添加进去后禁止登陆

比如,在末尾添加了 ftp2 这个用户

[root@vm-50-156 vsftpd]# cat ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
ftp2

那么当你去登陆的时候就会出现

pi@raspberrypi:~/ftp $ ftp 192.168.50.156
Connected to 192.168.50.156.
220 (vsFTPd 3.0.2)
Name (192.168.50.156:pi): ftp2
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
  • user_list //这个文件由主配置文件的userlist_enable 参数控制,当其值为 NO,则允许登陆,当其值为 YES 则禁止登陆

例如:

userlist_enable=NO    

则结果

pi@raspberrypi:~/ftp $ ftp 192.168.50.156
Connected to 192.168.50.156.
220 (vsFTPd 3.0.2)
Name (192.168.50.156:pi): ftp1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

如果为 YES

userlist_enable=YES


pi@raspberrypi:~/ftp $ ftp 192.168.50.156
Connected to 192.168.50.156.
220 (vsFTPd 3.0.2)
Name (192.168.50.156:pi): ftp1
530 Permission denied.
Login failed.
ftp>

定制登陆信息

1.配置文件

[root@vm-50-156 ftp1]# vim /etc/vsftpd/vsftpd.conf

dirmessage_enable=YES

默认情况会读取 ftp 用户家目录的.message文件,所以你可以创建一个.message文件到家目录中,比如有个用户 ftp1,

[root@vm-50-156 ftp1]# pwd
/home/ftp1
[root@vm-50-156 ftp1]# ls
[root@vm-50-156 ftp1]# ll -a
total 16
drwx------  2 ftp1 ftp   78 May  6 14:41 .
drwxr-xr-x. 8 root root  89 May  6 14:19 ..
-rw-r--r--  1 ftp1 ftp   18 Dec  7 07:19 .bash_logout
-rw-r--r--  1 ftp1 ftp  193 Dec  7 07:19 .bash_profile
-rw-r--r--  1 ftp1 ftp  231 Dec  7 07:19 .bashrc
-rw-r--r--  1 root root 113 May  6 14:41 .message    

查看文件内容

[root@vm-50-156 ftp1]# cat .message
--欢迎您来到awen 的FTP!
--博客: https://awen.me

客户端登陆

pi@raspberrypi:~/ftp $ ftp 192.168.50.156
Connected to 192.168.50.156.
220 (vsFTPd 3.0.2)
Name (192.168.50.156:pi): ftp1
331 Please specify the password.
Password:
230---欢迎您来到awen 的FTP!
230---博客: https://awen.me
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>    

禁锢在用户的主目录

默认情况下

ftp> pwd
257 "/home/ftp1"
ftp> cd / # 切换到根目录,发现可以查看根目录下的所以目录了,通常这样是不被运行的
250 Directory successfully changed.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
lrwxrwxrwx    1 0        0               7 May 01 11:31 bin -> usr/bin
dr-xr-xr-x    5 0        0            4096 May 06 01:10 boot
drwxr-xr-x   21 0        0            3420 May 06 05:23 dev
drwxr-xr-x  101 0        0            8192 May 06 06:19 etc
-rw-rw----    1 0        0           36741 May 04 03:12 frpc.2017-05-03.log
-rw-rw----    1 0        0           83890 May 06 05:23 frpc.log
drwxr-xr-x    8 0        0              89 May 06 06:19 home
lrwxrwxrwx    1 0        0               7 May 01 11:31 lib -> usr/lib
lrwxrwxrwx    1 0        0               9 May 01 11:31 lib64 -> usr/lib64
drwxr-xr-x    2 0        0               6 Nov 05 15:38 media
drwxr-xr-x    2 0        0               6 Nov 05 15:38 mnt
drwxr-xr-x    5 0        0            4096 May 06 02:33 opt
dr-xr-xr-x  286 0        0               0 May 06 05:23 proc
dr-xr-x---    9 0        0            4096 May 06 06:47 root
drwxr-xr-x   32 0        0            1140 May 06 05:34 run
lrwxrwxrwx    1 0        0               8 May 01 11:31 sbin -> usr/sbin
drwxr-xr-x    2 0        0               6 Nov 05 15:38 srv
dr-xr-xr-x   13 0        0               0 May 06 05:23 sys
drwxrwxrwt   36 0        0            4096 May 06 06:46 tmp
drwxr-xr-x   13 0        0             155 May 01 11:31 usr
drwxr-xr-x   21 0        0            4096 May 06 05:34 var
drwxr-xr-x    3 0        0             239 May 05 08:27 vm-images
drwxr-xr-x    2 0        0              99 May 03 04:43 vm-iso
226 Directory send OK.    

注释

chroot_local_user=NO # 如果未 NO 则chroot_list文件中的用户禁止访问其他目录,如果为 YES,则chroot_list中的用户可以访问其他目录
chroot_list_enable=YES
allow_writeable_chroot=YES #添加这行
chroot_list_file=/etc/vsftpd/chroot_list

然后重启服务,然后将禁止访问上一级目录的用户添加到

[root@vm-50-156 vsftpd]# cat chroot_list
ftp1

当我们的chroot_local_user 设置为 NO 的时候,访问 发现被禁止了

pi@raspberrypi:~/ftp $ ftp 192.168.50.156
Connected to 192.168.50.156.
220 (vsFTPd 3.0.2)
Name (192.168.50.156:pi): ftp1
331 Please specify the password.
Password:
230---欢迎您来到awen 的FTP!
230---博客: https://awen.me
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
226 Directory send OK.
ftp> cd /
250 Directory successfully changed.
ftp> pwd
257 "/"
ftp> pwd
257 "/"
ftp> cd /
250 Directory successfully changed.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
226 Directory send OK.
ftp> quit

反之为 YES 则

pi@raspberrypi:~/ftp $ ftp 192.168.50.156
Connected to 192.168.50.156.
220 (vsFTPd 3.0.2)
Name (192.168.50.156:pi): ftp1
331 Please specify the password.
Password:
230---欢迎您来到awen 的FTP!
230---博客: https://awen.me
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
226 Directory send OK.
ftp> cd /
250 Directory successfully changed.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
lrwxrwxrwx    1 0        0               7 May 01 11:31 bin -> usr/bin
dr-xr-xr-x    5 0        0            4096 May 06 01:10 boot
drwxr-xr-x   21 0        0            3420 May 06 05:23 dev
drwxr-xr-x  101 0        0            8192 May 06 06:19 etc
-rw-rw----    1 0        0           36741 May 04 03:12 frpc.2017-05-03.log
-rw-rw----    1 0        0           83890 May 06 05:23 frpc.log
drwxr-xr-x    8 0        0              89 May 06 06:19 home
lrwxrwxrwx    1 0        0               7 May 01 11:31 lib -> usr/lib
lrwxrwxrwx    1 0        0               9 May 01 11:31 lib64 -> usr/lib64
drwxr-xr-x    2 0        0               6 Nov 05 15:38 media
drwxr-xr-x    2 0        0               6 Nov 05 15:38 mnt
drwxr-xr-x    5 0        0            4096 May 06 02:33 opt
dr-xr-xr-x  288 0        0               0 May 06 05:23 proc
dr-xr-x---    9 0        0            4096 May 06 07:07 root
drwxr-xr-x   32 0        0            1140 May 06 05:34 run
lrwxrwxrwx    1 0        0               8 May 01 11:31 sbin -> usr/sbin
drwxr-xr-x    2 0        0               6 Nov 05 15:38 srv
dr-xr-xr-x   13 0        0               0 May 06 05:23 sys
drwxrwxrwt   36 0        0            4096 May 06 07:04 tmp
drwxr-xr-x   13 0        0             155 May 01 11:31 usr
drwxr-xr-x   21 0        0            4096 May 06 05:34 var
drwxr-xr-x    3 0        0             239 May 05 08:27 vm-images
drwxr-xr-x    2 0        0              99 May 03 04:43 vm-iso
226 Directory send OK.
ftp>

虚拟用户

1.创建一个文件vusers.list 添加内容

[root@vm-50-156 vsftpd]# vim vusers.list
[root@vm-50-156 vsftpd]# cat vusers.list
mike 用户名
123 密码
john
456

2.生成 db 文件

[root@vm-50-156 vsftpd]# db_load -T -t hash -f vusers.list vusers.db
[root@vm-50-156 vsftpd]# ls
chroot_list  ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh  vusers.db  vusers.list
[root@vm-50-156 vsftpd]#

查看文件类型

[root@vm-50-156 vsftpd]# file vusers.db
vusers.db: Berkeley DB (Hash, version 9, native byte-order)    

设置权限

[root@vm-50-156 vsftpd]# chown 600 /etc/vsftpd/vusers.*    

创建用户

#useradd -d /var/ftproot/ -s /sbin/nologin virtual
useradd -d /var/ftproot/ -s /sbin/nologin virtual
useradd: user 'virtual' already exists    

赋予其权限

chmod 755 /var/ftproot/    

3.建立支持虚拟用户的 PAM 认证文件

[root@vm-50-156 /]# vim /etc/pam.d/vsftpd.vu
[root@vm-50-156 /]# cat /etc/pam.d/vsftpd.vu
auth required pam_userdb.so.db=/etc/vsftpd/vusers.db
account required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers

4.修改配置文件

[root@vm-50-156 /]# vim /etc/vsftpd/vsftpd.conf
[root@vm-50-156 /]# systemctl restart vsftpd.service

配置文件内容

guest_enable=YES
guest_username=virtual
pam_service_name=vsftpd.vu
userlist_enable=NO
tcp_wrappers=YES
allow_writeable_chroot=YES        

登陆失败

pi@raspberrypi:~ $ ftp 192.168.50.156
Connected to 192.168.50.156.
220 (vsFTPd 3.0.2)
Name (192.168.50.156:pi): john
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.

查看

[root@vm-50-156 vsftpd]# systemctl status vsftpd.service
● vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2017-05-06 15:43:42 CST; 38s ago
  Process: 8596 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
 Main PID: 8597 (vsftpd)
   CGroup: /system.slice/vsftpd.service
           ├─8597 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
           ├─8598 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
           └─8599 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

May 06 15:43:42 vm-50-156 systemd[1]: Stopping Vsftpd ftp daemon...
May 06 15:43:42 vm-50-156 systemd[1]: Starting Vsftpd ftp daemon...
May 06 15:43:42 vm-50-156 systemd[1]: Started Vsftpd ftp daemon.
May 06 15:43:54 vm-50-156 vsftpd[8598]: PAM unable to dlopen(/usr/lib64/security/pam_userdb.so.db=/etc/vsft...ctory
May 06 15:43:54 vm-50-156 vsftpd[8598]: PAM adding faulty module: /usr/lib64/security/pam_userdb.so.db=/etc...users
Hint: Some lines were ellipsized, use -l to show in full.
[root@vm-50-156 vsftpd]#

检查是认证文件配置错了

[root@vm-50-156 /]# cat /etc/pam.d/vsftpd.vu
auth required pam_userdb.so.db=/etc/vsftpd/vusers.db
account required pam_userdb.so.db=/etc/vsftpd/vusers # 这里手残多打了个.
account required pam_userdb.so db=/etc/vsftpd/vusers

重启下

pi@raspberrypi:~ $ ftp 192.168.50.156
Connected to 192.168.50.156.
220 (vsFTPd 3.0.2)
Name (192.168.50.156:pi): john
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>    

ok 了

配置 SSL 加密的FTP 服务

vsftpd是(very secure FTP)的缩写,是一款咋*nix上非常安全的ftp软件,它基于GPL开发,支持IPV6、SSL加密等等。其安全性主要体现在:

  • 进程分离,处理不同人物的进程是彼此独立运行。
  • 进程均以最小的权限运行。
  • 多数进程使用chroot进行锁定,防止越权访问非法目录。

chroot 是一种改变根的技术,比如我们创建一个/var/ftp/pub/,则该目录对于客户来说就是共享的根目录。

ftp的端口号是21

ftp的工作模式

1.主动工作模式

工作步骤:

  • 第一步,客户端随机开启大于1024的端口X与服务器的21端口进行连接通信,建立连接后,客户端可以随时通过该连接通道与服务器进行上传或下载。
  • 第二步,当客户端需要与服务器进行数据传输时,客户端会再开启一个大于1024的随机端口Y,并将Y端口号通过之前的命令通道传送给服务器的21端口
  • 第三步,服务器获取到可短的第二个端口后会主动连接客户端的该端口,通过TCP三次握手后,完成服务器与客户端数据通道的建立,所有数据均通过该端口进行传输。

2.被动模式

  • 第一步,客户端随机开启大于1024的X端口与服务器的21端口进行连接。
  • 第二步,当客户端需要与服务器进行数据传输时候,客户端从命令通道发送数据请求要求上传或下载数据。
  • 第三部,服务器收到数据请求后会随机开启一个端口Y,并且通过命令通道将该端口信息传输给服务端。
    -第四步,客户端收到服务器发送的端口Y信息,在客户端本地开启一个随机端口Z,此时客户端在主动通过本机的Z端口与服务器的Y端口进行连接,通过TCP三次握手后,进行数据传输

FTP协议需要多个网络端口才可以正常工作,期中一个端口专门用于命令的传输,另一个用于数据的传输。主动模式在传输数据时,服务器会主动连接客户端,被动模式下,客户端主动连接服务器。

为什么会有被动模式?
因为客户端大多数主机都在防火墙内,防火墙有可能会阻止端口对外发送数据,这样客户端连接ftp服务器,但是外网不能响应客户端,因此就有了被动模式。

435435454.png!awen

安装

yum -y install vsftpd

安装完成后,我们关闭防火墙,开启ftp服务

/etc/init.d/vsftpd restart
/etc/init.d/iptables stop
 chkconfig iptables off

通过filezilla 去连接,只需要填写主机名就可以匿名连接到ftp服务

112.png!awen

配置文件

vsftp的配置文件在/etc/vsftpd目录下,

[root@elk-node-1 ~]# cd /etc/vsftpd/
[root@elk-node-1 vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh
  • ftpusers 黑名单
  • user_list 控制名单(由配置文件控制是白名单还是黑名单)
  • /var/ftp ftp共享目录
  • /var/log/xferlog 日志文件

主配置文件参数

vsftpd的主配置文件是vsftpd.conf

# 是否允许匿名登录FTP服务器,默认设置为YES允许
# 用户可使用用户名ftp或anonymous进行ftp登录,口令为用户的E-mail地址。
# 如不允许匿名访问则设置为NO
anonymous_enable=YES
# 是否允许本地用户(即linux系统中的用户帐号)登录FTP服务器,默认设置为YES允许
# 本地用户登录后会进入用户主目录,而匿名用户登录后进入匿名用户的下载目录/var/ftp/pub
# 若只允许匿名用户访问,前面加上#注释掉即可阻止本地用户访问FTP服务器
local_enable=YES
# 是否允许本地用户对FTP服务器文件具有写权限,默认设置为YES允许
write_enable=YES 
# 掩码,本地用户默认掩码为077
# 你可以设置本地用户的文件掩码为缺省022,也可根据个人喜好将其设置为其他值
#local_umask=022
# 是否允许匿名用户上传文件,须将全局的write_enable=YES。默认为YES
#anon_upload_enable=YES
# 是否允许匿名用户创建新文件夹
#anon_mkdir_write_enable=YES 
# 是否激活目录欢迎信息功能
# 当用户用CMD模式首次访问服务器上某个目录时,FTP服务器将显示欢迎信息
# 默认情况下,欢迎信息是通过该目录下的.message文件获得的
# 此文件保存自定义的欢迎信息,由用户自己建立
#dirmessage_enable=YES
# 是否让系统自动维护上传和下载的日志文件
# 默认情况该日志文件为/var/log/vsftpd.log,也可以通过下面的xferlog_file选项对其进行设定
# 默认值为NO
xferlog_enable=YES
# Make sure PORT transfer connections originate from port 20 (ftp-data).
# 是否设定FTP服务器将启用FTP数据端口的连接请求
# ftp-data数据传输,21为连接控制端口
connect_from_port_20=YES
# 设定是否允许改变上传文件的属主,与下面一个设定项配合使用
# 注意,不推荐使用root用户上传文件
#chown_uploads=YES
# 设置想要改变的上传文件的属主,如果需要,则输入一个系统用户名
# 可以把上传的文件都改成root属主。whoever:任何人
#chown_username=whoever
# 设定系统维护记录FTP服务器上传和下载情况的日志文件
# /var/log/vsftpd.log是默认的,也可以另设其它
#xferlog_file=/var/log/vsftpd.log
# 是否以标准xferlog的格式书写传输日志文件
# 默认为/var/log/xferlog,也可以通过xferlog_file选项对其进行设定
# 默认值为NO
#xferlog_std_format=YES
# 以下是附加配置,添加相应的选项将启用相应的设置
# 是否生成两个相似的日志文件
# 默认在/var/log/xferlog和/var/log/vsftpd.log目录下
# 前者是wu_ftpd类型的传输日志,可以利用标准日志工具对其进行分析;后者是vsftpd类型的日志
#dual_log_enable
# 是否将原本输出到/var/log/vsftpd.log中的日志,输出到系统日志
#syslog_enable
# 设置数据传输中断间隔时间,此语句表示空闲的用户会话中断时间为600秒
# 即当数据传输结束后,用户连接FTP服务器的时间不应超过600秒。可以根据实际情况对该值进行修改
#idle_session_timeout=600
# 设置数据连接超时时间,该语句表示数据连接超时时间为120秒,可根据实际情况对其个修改
#data_connection_timeout=120
# 运行vsftpd需要的非特权系统用户,缺省是nobody
#nopriv_user=ftpsecure
# 是否识别异步ABOR请求。
# 如果FTP client会下达“async ABOR”这个指令时,这个设定才需要启用
# 而一般此设定并不安全,所以通常将其取消
#async_abor_enable=YES
# 是否以ASCII方式传输数据。默认情况下,服务器会忽略ASCII方式的请求。
# 启用此选项将允许服务器以ASCII方式传输数据
# 不过,这样可能会导致由"SIZE /big/file"方式引起的DoS攻击
#ascii_upload_enable=YES
#ascii_download_enable=YES
# 登录FTP服务器时显示的欢迎信息
# 如有需要,可在更改目录欢迎信息的目录下创建名为.message的文件,并写入欢迎信息保存后
#ftpd_banner=Welcome to blah FTP service.
# 黑名单设置。如果很讨厌某些email address,就可以使用此设定来取消他的登录权限
# 可以将某些特殊的email address抵挡住。
#deny_email_enable=YES
# 当上面的deny_email_enable=YES时,可以利用这个设定项来规定哪些邮件地址不可登录vsftpd服务器
# 此文件需用户自己创建,一行一个email address即可
#banned_email_file=/etc/vsftpd/banned_emails
# 用户登录FTP服务器后是否具有访问自己目录以外的其他文件的权限
# 设置为YES时,用户被锁定在自己的home目录中,vsftpd将在下面chroot_list_file选项值的位置寻找chroot_list文件
# 必须与下面的设置项配合
#chroot_list_enable=YES
# 被列入此文件的用户,在登录后将不能切换到自己目录以外的其他目录
# 从而有利于FTP服务器的安全管理和隐私保护。此文件需自己建立
#chroot_list_file=/etc/vsftpd/chroot_list
# 是否允许递归查询。默认为关闭,以防止远程用户造成过量的I/O
#ls_recurse_enable=YES
# 是否允许监听。
# 如果设置为YES,则vsftpd将以独立模式运行,由vsftpd自己监听和处理IPv4端口的连接请求
listen=YES
# 设定是否支持IPV6。如要同时监听IPv4和IPv6端口,
# 则必须运行两套vsftpd,采用两套配置文件
# 同时确保其中有一个监听选项是被注释掉的
#listen_ipv6=YES
# 设置PAM外挂模块提供的认证服务所使用的配置文件名,即/etc/pam.d/vsftpd文件
# 此文件中file=/etc/vsftpd/ftpusers字段,说明了PAM模块能抵挡的帐号内容来自文件/etc/vsftpd/ftpusers中
#pam_service_name=vsftpd
# 是否允许ftpusers文件中的用户登录FTP服务器,默认为NO
# 若此项设为YES,则user_list文件中的用户允许登录FTP服务器
# 而如果同时设置了userlist_deny=YES,则user_list文件中的用户将不允许登录FTP服务器,甚至连输入密码提示信息有
#userlist_enable=YES/NO
# 设置是否阻扯user_list文件中的用户登录FTP服务器,默认为YES
#userlist_deny=YES/NO
# 是否使用tcp_wrappers作为主机访问控制方式。
# tcp_wrappers可以实现linux系统中网络服务的基于主机地址的访问控制
# 在/etc目录中的hosts.allow和hosts.deny两个文件用于设置tcp_wrappers的访问控制
# 前者设置允许访问记录,后者设置拒绝访问记录。
# 如想限制某些主机对FTP服务器192.168.57.2的匿名访问,编缉/etc/hosts.allow文件,如在下面增加两行命令:
# vsftpd:192.168.57.1:DENY 和vsftpd:192.168.57.9:DENY
# 表明限制IP为192.168.57.1/192.168.57.9主机访问IP为192.168.57.2的FTP服务器
# 此时FTP服务器虽可以PING通,但无法连接
tcp_wrappers=YES

登录方式

vsftp提供3种远程的登录方式:

  • 匿名登录方式

就是不需要用户名,密码。就能登录到服务器电脑里面

  • 本地用户方式

需要帐户名和密码才能登录。而且,这个帐户名和密码,都是在你linux系统里面,已经有的用户。

  • 虚拟用户方式

同样需要用户名和密码才能登录。但是和上面的区别就是,这个用户名和密码,在你linux系统中是没有的(没有该用户帐号)

建立本地账户连接

1.修改配置文件

[root@elk-node-1 vsftpd]# cat vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
xferlog_std_format=YES
chroot_local_user=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

重启ftp服务

[root@elk-node-1 vsftpd]# /etc/init.d/vsftpd restart
Shutting down vsftpd:                                      [  OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]

2.建立本地用户

# useradd -s /sbin/nologin tom
# useradd -s /sbin/nologin awen
[root@elk-node-1 vsftpd]# cd /home/
awen/ tom/  
[root@elk-node-1 vsftpd]# touch /home/{awen,tom}/test.txt

3.连接ftp
安装ftp

yum -y install ftp

连接

[root@elk-node-1 vsftpd]# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 2.2.2)
Name (127.0.0.1:root): awen
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 
ftp> 
ftp> dir
227 Entering Passive Mode (127,0,0,1,135,237).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Mar 18 12:24 test.txt
226 Directory send OK.

也可以使用filezilla连接

fileok.png!awen

配置SSL

由于ftp默认的配置是普通ftp模式,数据都是明文传输,特别是密码也会被明文显示,这个我们可以就上面的配置去登陆抓包看

pass.png!awen

可以看到,密码完全明文,假如说被非法分子拦截数据包,后果不堪设想,这样我们就需要配置加密的连接,让FTP变得安全些。

首先,在/etc/vsftpd/目录创建一个ssl目录,然后申请证书,参考使用验证 DNS 的方式申请 Let’s encrypt 证书,证书申请完成后,将证书复制到创建的ssl目录中

cp fullchain.cer v0.ftp.v5linux.com.key /etc/vsftpd/ssl/

在上面的ftp配置文件中追加

allow_anon_ssl=NO #阻止匿名用户使用 SSL 登录
force_local_data_ssl=YES
force_local_logins_ssl=YES
require_ssl_reuse=NO 所有的 SSL 数据链接都需重用已经建立的 SSL 会话
ssl_ciphers=HIGH
pasv_min_port=40000
pasv_max_port=50000
debug_ssl=YES
tcp_wrappers=YES
ssl_enable=YES
ssl_tlsv1=YES #开启tlsv1
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/vsftpd/ssl/fullchain.cer #设置公钥
rsa_private_key_file=/etc/vsftpd/ssl/v0.ftp.v5linux.com.key #设置私钥

该部分配置参考:https://linux.cn/article-8295-1.html

然后重启ftp服务

324435345.png!awen

通过wireshark 抓包看下
tls.png!awen

最终结果

324324.png!awen

建立虚拟账户

未完待续。。

FTP常见故障

一般使用filezilla 连接ftp的话,如果有报错,在地址栏下方的状态区会有提示。

1.530 login incorrect
这个说明是账户验证失败

2.500 oops:cannot change directory
这种表述无权限切换目录

3.不支持TLS登陆,这种情况可以使用filezilla 选择文件—站点管理器,新建一个站点,然后填写相关信息后,加密方式选择普通FTP模式。
242343454365456.png!awen

4.报错如下,这种是因为配置文件多了个空格,需要检查下配置文件

# /etc/init.d/vsftpd restart
Shutting down vsftpd:                                      [FAILED]
Starting vsftpd for vsftpd: 500 OOPS: bad bool value in config file for: allow_anon_ssl
                                                           [FAILED]

samba 服务

安装

[root@localhost ~]# yum -y install samba samba-client samba-common

放行端口

iptables -A INPUT -p tcp -m multiport --dport 139,445 -j ACCEPT

原理

windows 和samba服务进行通信使用的是NETBIOS协议
linux和linux 之间通信使用的是SMB协议

配置文件

[root@server samba]# cat smb.conf
# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.

[global]  
    workgroup = myshare
    security = user
    map to guest = bad user
    passdb backend = tdbsam

    printing = cups
    printcap name = cups
    load printers = yes
    cups options = raw
[homes]  
    comment = Home Directories 
    valid users = %S, %D%w%S 
    browseable = No
    read only = No
    inherit acls = Yes

[printers]
    comment = All Printers
    path = /var/tmp
    printable = Yes
    create mask = 0600
    browseable = No

[print$]
    comment = Printer Drivers
    path = /var/lib/samba/drivers
    write list = root
    create mask = 0664
    directory mask = 0775
[share]
    path=/smbshare
    public=yes
    writable=yes
[share1]
    path=/smbu
    valid users = smbuser1,smbuser2,@g1
    writable=yes

配置匿名访问配置

[global]
        workgroup = myshare
        security = user
        map to guest = bad user # 添加此行
        passdb backend = tdbsam

        printing = cups
        printcap name = cups
        load printers = yes
        cups options = raw

末尾曾加

[share]
        path = /smbshare
        public = yes
        writable=yes        

重启

   [root@localhost ~]# systemctl enable smb nmb # smb是Linux和Linux之间的协议,nmb是Linux和Windows之间的协议
Created symlink from /etc/systemd/system/multi-user.target.wants/smb.service to /usr/lib/systemd/system/smb.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/nmb.service to /usr/lib/systemd/system/nmb.service.

[root@localhost ~]# systemctl restart smb nmb   

后面连接出错,请先关selinux 然后重启服务

客户端连接

[root@node-server-1 ~]# mount -t cifs //192.168.50.156/public /media/
mount: wrong fs type, bad option, bad superblock on //192.168.50.156/public,
       missing codepage or helper program, or other error
       (for several filesystems (e.g. nfs, cifs) you might
       need a /sbin/mount.<type> helper program)

       In some cases useful info is found in syslog - try
       dmesg | tail or so.

需要安装

yum -y install cifs-utils

windows连接

然后再次连接

[root@desktop ~]# mount -t cifs //172.10.100.128/share /media/
Password for root@//172.10.100.128/share:
[root@desktop ~]# cd /media/
[root@desktop media]# ls
ls: reading directory .: Permission denied
[root@desktop media]#

添加用户

1.创建samba用户

[root@server samba]# useradd -s /sbin/nologin smbuser1
[root@server samba]# smbpasswd -a smbuser1
New SMB password:
Retype new SMB password:
Added user smbuser1.

配置文件假如 smbuser1

[share1]
    path=/smbu
    valid users = smbuser1
    writable=yes

挂载

mount -t cifs //172.10.100.128/share1 -o username=smbuser1 /mnt/u1/

设置开机启动

[root@desktop mnt]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Sat May  6 22:20:05 2017
#
# 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
#
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=8567c1db-cc09-442e-83ce-cfcdd1f8f0df /boot                   xfs     defaults        0 0
/dev/mapper/cl-swap     swap                    swap    defaults        0 0
//172.10.100.128/share1 /mnt/u4 cifs defaults, username=smbuser1,password=123456 0 0    

多用户设置

1.创建多个 Samba 用户

[root@server samba]# useradd -s /sbin/nologin smbuser2
[root@server samba]# smbpasswd -a smbuser2
New SMB password:
Retype new SMB password:
Added user smbuser2.
[root@server samba]# groupadd g1
[root@server samba]# useradd -s /sbin/nologin -g g1 smbu3
[root@server samba]# smbpasswd -a smbu3
New SMB password:
Retype new SMB password:
Added user smbu3.    

2.配置文件修改为

[share1]
    path=/smbu
    valid users = smbuser1,smbuser2,@g1 //多个用户用,隔开,@代表组,这里表示组1
    writable=yes

3.客户端挂载

mount -t cifs //172.10.100.128/share1 -o username=smbuser1 /mnt/u1/
mount -t cifs //172.10.100.128/share1 -o username=smbuser2 /mnt/u2/
mount -t cifs //172.10.100.128/share1 -o username=smbu3 /mnt/u3/    

4.配置文件多个用户共享

[root@desktop samba]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Sat May  6 22:20:05 2017
#
# 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
#
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=8567c1db-cc09-442e-83ce-cfcdd1f8f0df /boot                   xfs     defaults        0 0
/dev/mapper/cl-swap     swap                    swap    defaults        0 0
//172.10.100.128/share1 /mnt/u4 cifs defaults,credentials=/smb.mount 0 0    

创建一个文件

[root@desktop samba]# cat /smb.mount
username=smbuser1
password=123456
username=smbuser2
password=123456    

挂载

[root@desktop samba]# mount -a
[root@desktop samba]# mount | tail -1
//172.10.100.128/share1 on /mnt/u4 type cifs (rw,relatime,vers=1.0,cache=strict,username=smbuser2,domain=SERVER,uid=0,noforceuid,gid=0,noforcegid,addr=172.10.100.128,unix,posixpaths,serverino,mapposix,acl,rsize=1048576,wsize=65536,echo_interval=60,actimeo=1)    

故障处理

1.报错 Unable to find suitable address.

[root@client mnt]# mount -t cifs -o username=smb1  //172.10.100.129/share /mnt
Password for smb1@//172.10.100.129/share:  ******
Unable to find suitable address.

检查防火墙

使用autofs自动挂载Samba

配置

[root@desktop /]# vim /etc/auto.master

增加

/smb1   /etc/auto.cifs

然后

[root@desktop /]# cp /etc/auto.misc /etc/auto.cifs

编辑 /etc/auto.cifs 添加

smb1 -fstype=cifs,credentials=/smb.mount       ://172.10.100.128/share1

这里需要根目录下有 smb.mount文件

[root@desktop ~]# cat /smb.mount
username=smbuser1
password=123456    

或者

smb1 -fstype=cifs,username=xxxx,password=xxxxx       ://172.10.100.128/share1

访问

[root@desktop ~]# cd /smb1/
[root@desktop smb1]# ls
smb1
[root@desktop smb1]# cd smb1/
[root@desktop smb1]# ls
a1  a10  a2  a3  a4  a5  a6  a7  a8  a9    

如果报权限错误,请关selinux

Apache htttpd 服务

安装

[root@server ~]# yum -y install httpd
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Package httpd-2.4.6-45.el7.centos.x86_64 already installed and latest version
Nothing to do
[root@server ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@server ~]# systemctl start httpd

浏览器访问

命令行访问

[root@desktop smb1]# curl -I http://172.10.100.128 -v
* About to connect() to 172.10.100.128 port 80 (#0)
*   Trying 172.10.100.128...
* Connected to 172.10.100.128 (172.10.100.128) port 80 (#0)
> HEAD / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 172.10.100.128
> Accept: */*
>
< HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
< Date: Sun, 07 May 2017 06:10:27 GMT
Date: Sun, 07 May 2017 06:10:27 GMT
< Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips mod_fcgid/2.3.9
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips mod_fcgid/2.3.9
< Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
< ETag: "1321-5058a1e728280"
ETag: "1321-5058a1e728280"
< Accept-Ranges: bytes
Accept-Ranges: bytes
< Content-Length: 4897
Content-Length: 4897
< Content-Type: text/html; charset=UTF-8
Content-Type: text/html; charset=UTF-8

<
* Connection #0 to host 172.10.100.128 left intact

工作目录

  • /etc/httpd/ 配置文件,主程序目录
  • /var/www/html/ web 主目录
  • httpd 脚本程序
  • /var/log

在主目录添加一个文件内容为 hello world

[root@server html]# ls
index.html
[root@server html]# cat index.html
hello world
[root@server html]# pwd
/var/www/html
[root@server html]#

内容

<html>
<head>
<title>This is test page</title>
</head>
<body>
        <h1>hello world! </h1>
</body>
</html>

主配置文件

[root@server html]# cat /etc/httpd/conf/httpd.conf

ServerRoot "/etc/httpd"

Listen 80 #监听端口

Include conf.modules.d/*.conf #导入外部的模块配置文件

User apache #运行用户
Group apache #运行组


ServerAdmin root@localhost #管理员邮箱

ServerName www.example.com:80 #域名

<Directory />
    AllowOverride none
    Require all denied
</Directory>


DocumentRoot "/var/www/html" #web 文件主目录

<Directory "/var/www">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

<Directory "/var/www/html">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.4/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride None

    #
    # Controls who can get stuff from this server.
    #
    Require all granted
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

<Files ".ht*">
    Require all denied
</Files>

ErrorLog "logs/error_log"

LogLevel warn

<IfModule log_config_module>
    #
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    #
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      # You need to enable mod_logio.c to use %I and %O
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    #
    # The location and format of the access logfile (Common Logfile Format).
    # If you do not define any access logfiles within a <VirtualHost>
    # container, they will be logged here.  Contrariwise, if you *do*
    # define per-<VirtualHost> access logfiles, transactions will be
    # logged therein and *not* in this file.
    #
    #CustomLog "logs/access_log" common

    #
    # If you prefer a logfile with access, agent, and referer information
    # (Combined Logfile Format) you can use the following directive.
    #
    CustomLog "logs/access_log" combined
</IfModule>

<IfModule alias_module>
    #
    # Redirect: Allows you to tell clients about documents that used to
    # exist in your server's namespace, but do not anymore. The client
    # will make a new request for the document at its new location.
    # Example:
    # Redirect permanent /foo http://www.example.com/bar

    #
    # Alias: Maps web paths into filesystem paths and is used to
    # access content that does not live under the DocumentRoot.
    # Example:
    # Alias /webpath /full/filesystem/path
    #
    # If you include a trailing / on /webpath then the server will
    # require it to be present in the URL.  You will also likely
    # need to provide a <Directory> section to allow access to
    # the filesystem path.

    #
    # ScriptAlias: This controls which directories contain server scripts.
    # ScriptAliases are essentially the same as Aliases, except that
    # documents in the target directory are treated as applications and
    # run by the server when requested rather than as documents sent to the
    # client.  The same rules about trailing "/" apply to ScriptAlias
    # directives as to Alias.
    #
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

</IfModule>

<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

<IfModule mime_module>
    #
    # TypesConfig points to the file containing the list of mappings from
    # filename extension to MIME-type.
    #
    TypesConfig /etc/mime.types

    #
    # AddType allows you to add to or override the MIME configuration
    # file specified in TypesConfig for specific file types.
    #
    #AddType application/x-gzip .tgz
    #
    # AddEncoding allows you to have certain browsers uncompress
    # information on the fly. Note: Not all browsers support this.
    #
    #AddEncoding x-compress .Z
    #AddEncoding x-gzip .gz .tgz
    #
    # If the AddEncoding directives above are commented-out, then you
    # probably should define those extensions to indicate media types:
    #
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz

    #
    # AddHandler allows you to map certain file extensions to "handlers":
    # actions unrelated to filetype. These can be either built into the server
    # or added with the Action directive (see below)
    #
    # To use CGI scripts outside of ScriptAliased directories:
    # (You will also need to add "ExecCGI" to the "Options" directive.)
    #
    #AddHandler cgi-script .cgi

    # For type maps (negotiated resources):
    #AddHandler type-map var

    #
    # Filters allow you to process content before it is sent to the client.
    #
    # To parse .shtml files for server-side includes (SSI):
    # (You will also need to add "Includes" to the "Options" directive.)
    #
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>

AddDefaultCharset UTF-8 #默认编码格式是 UFT-8

<IfModule mime_magic_module>
    #
    # The mod_mime_magic module allows the server to use various hints from the
    # contents of the file itself to determine its type.  The MIMEMagicFile
    # directive tells the module where the hint definitions are located.
    #
    MIMEMagicFile conf/magic
</IfModule>


EnableSendfile on

IncludeOptional conf.d/*.conf #导入外部的配置文件

日志文件

日志文件分为 access 成功的 和 error 失败的日志 以及一些虚拟机主机的日志,都可以在/var/log/httpd中找到

[root@server html]# cd /var/log/httpd
access_log #正常的
error_log #非正常的
ssl_access_log #https 的正常日志
ssl_error_log #https 的非正常日志
ssl_request_log # https 的请求日志

baidu.com-access_log google.com-access_log # 这两行是自己定义的虚拟主机的日志
baidu.com-error_log google.com-error_log

[root@server html]# tail -f /var/log/httpd/access_log
172.10.100.1 - - [07/May/2017:02:18:21 -0400] "GET /noindex/css/fonts/Light/OpenSans-Light.woff HTTP/1.1" 404 241 "http://172.10.100.128/noindex/css/open-sans.css" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36"
172.10.100.1 - - [07/May/2017:02:18:21 -0400] "GET /noindex/css/fonts/Bold/OpenSans-Bold.woff HTTP/1.1" 404 239 "http://172.10.100.128/noindex/css/open-sans.css" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36"
172.10.100.1 - - [07/May/2017:02:18:21 -0400] "GET /noindex/css/fonts/Light/OpenSans-Light.ttf HTTP/1.1" 404 240 "http://172.10.100.128/noindex/css/open-sans.css" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36"
172.10.100.1 - - [07/May/2017:02:18:21 -0400] "GET /noindex/css/fonts/Bold/OpenSans-Bold.ttf HTTP/1.1" 404 238 "http://172.10.100.128/noindex/css/open-sans.css" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36"
172.10.100.1 - - [07/May/2017:02:18:21 -0400] "GET /favicon.ico HTTP/1.1" 404 209 "http://172.10.100.128/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36"
172.10.100.1 - - [07/May/2017:02:19:12 -0400] "-" 408 - "-" "-"
172.10.100.1 - - [07/May/2017:02:19:12 -0400] "-" 408 - "-" "-"
172.10.100.1 - - [07/May/2017:02:19:12 -0400] "-" 408 - "-" "-"
172.10.100.1 - - [07/May/2017:02:22:08 -0400] "GET / HTTP/1.1" 200 12 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36"
172.10.100.1 - - [07/May/2017:02:22:08 -0400] "GET /favicon.ico HTTP/1.1" 404 209 "http://172.10.100.128/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36"

格式通常在配置文件中定义

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
      LogFormat "%h %l %u %t \"%r\" %>s %b" common

以这条日志分析

172.10.100.1 - - [07/May/2017:02:22:08 -0400] "GET /favicon.ico HTTP/1.1" 404 209 "http://172.10.100.128/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36"

从左到右分别是 [请求的 ip 地址] – [请求的时间] [http 的方法] [请求的 uri] [http 的协议] [请求的状态码] [请求的文件大小] [请求的url] [user-agent]

基于主机名的虚拟主机

[root@server html]# cp /usr/share/doc/httpd-2.4.6/httpd-vhosts.conf /etc/httpd/conf.d/01-www.baidu.com.conf
[root@server html]# cp /usr/share/doc/httpd-2.4.6/httpd-vhosts.conf /etc/httpd/conf.d/00-www.google.com.conf

内容

    <VirtualHost *:@@Port@@>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "@@ServerRoot@@/docs/dummy-host.example.com"
    ServerName dummy-host.example.com
    ServerAlias www.dummy-host.example.com
    ErrorLog "/var/log/httpd/dummy-host.example.com-error_log"
    CustomLog "/var/log/httpd/dummy-host.example.com-access_log" common
</VirtualHost>

<VirtualHost *:@@Port@@>
    ServerAdmin webmaster@dummy-host2.example.com
    DocumentRoot "@@ServerRoot@@/docs/dummy-host2.example.com"
    ServerName dummy-host2.example.com
    ErrorLog "/var/log/httpd/dummy-host2.example.com-error_log"
    CustomLog "/var/log/httpd/dummy-host2.example.com-access_log" common
</VirtualHost>

2.创建主机目录

[root@server html]# mkdir -p /var/www/baidu
[root@server html]# mkdir -p /var/www/google
[root@server html]# echo baidu >> /var/www//baidu/index.html
[root@server html]# echo google >> /var/www/google/index.html

3.修改 Google 的配置文件

vim /etc/httpd/conf.d/00-www.google.com.conf

修改内容如下

<VirtualHost *:80>
    #ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/var/www/google/"
    ServerName www.google.com
    ServerAlias www.dummy-host.example.com
    ErrorLog "/var/log/httpd/google.com-error_log"
    CustomLog "/var/log/httpd/google.com-access_log" common
 <Directory "/var/www/google">
    Require all granted
</Directory>
</VirtualHost>

4.修改 baidu 的配置文件

vim /etc/httpd/conf.d/00-www.baidu.com.conf

修改如下

<VirtualHost *:80>
    #ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/var/www/baidu/"
    ServerName www.baidu.com
    #ServerAlias www.dummy-host.example.com
    ErrorLog "/var/log/httpd/baidu.com-error_log"
    CustomLog "/var/log/httpd/baidu.com-access_log" common
    <Directory "/var/www/baidu">
        Require all granted
    </Directory>
</VirtualHost>

5.重启 httpd

[root@server html]# systemctl restart httpd

重启 httpd

6.客户端访问

[root@desktop httpd]# vim /etc/hosts
[root@desktop httpd]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.10.100.128 www.baidu.com
172.10.100.128 www.google.comc

7.访问

[root@desktop ~]# curl -X GET http://www.baidu.com
baidu
[root@desktop ~]# curl -X GET http://www.google.com
google

基于端口的虚拟主机

其实基于端口就是在 /etc/httpd/conf/httpd.conf 增加一个监听端口

[root@server html]# cat  /etc/httpd/conf/httpd.conf | grep ^Listen
Listen 80
Listen 8080

然后比如我要把 Google 的访问端口改为8080,就是将原来的端口80 修改为8080

[root@server html]# cat /etc/httpd/conf.d/00-www.google.com.conf | grep 8080
<VirtualHost *:8080>

客户端访问

1.先测下端口通不通

[root@desktop ~]# telnet 172.10.100.128 8080
Trying 172.10.100.128...
Connected to 172.10.100.128.
Escape character is '^]'.
^C
Connection closed by foreign host.

2.然后访问

[root@desktop ~]#
[root@desktop ~]# curl -X GET http://www.google.com:8080 -v
* About to connect() to www.google.com port 8080 (#0)
*   Trying 172.10.100.128...
* Connected to www.google.com (172.10.100.128) port 8080 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.google.com:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sun, 07 May 2017 07:20:52 GMT
< Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips mod_fcgid/2.3.9
< Last-Modified: Sun, 07 May 2017 07:00:15 GMT
< ETag: "7-54ee9acb5b2f4"
< Accept-Ranges: bytes
< Content-Length: 7
< Content-Type: text/html; charset=UTF-8
<
google
* Connection #0 to host www.google.com left intact
[root@desktop ~]#

访问控制

order 配置,定义了控制顺序

  • 先允许后拒绝,默认拒绝所有: Order allow,deny
  • 先拒绝后允许,默认允许所有:Order deny,allow

Deny from address1 address2 ……
Allow from address1 address2 ……

一般加在

[root@server html]# vim /etc/httpd/conf.d/00-www.google.com.conf
<VirtualHost *:8080>
    #ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/var/www/google/"
    ServerName www.google.com
    #ServerAlias www.dummy-host.example.com
    ErrorLog "/var/log/httpd/google.com-error_log"
    CustomLog "/var/log/httpd/google.com-access_log" common
    <Directory "/var/www/google">
        Order deny,allow
    deny from 172.10.100.131
    </Directory>
</VirtualHost>

然后重启

[root@server html]# systemctl restart httpd

在131的机器访问

[root@desktop ~]# curl -I http://www.google.com -v
* About to connect() to www.google.com port 80 (#0)
*   Trying 172.10.100.128...
* Connected to www.google.com (172.10.100.128) port 80 (#0)
> HEAD / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: www.google.com
> Accept: */*
>
< HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
< Date: Sun, 07 May 2017 07:47:33 GMT
Date: Sun, 07 May 2017 07:47:33 GMT
< Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips mod_fcgid/2.3.9
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips mod_fcgid/2.3.9
< Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
< ETag: "1321-5058a1e728280"
ETag: "1321-5058a1e728280"
< Accept-Ranges: bytes
Accept-Ranges: bytes
< Content-Length: 4897
Content-Length: 4897
< Content-Type: text/html; charset=UTF-8
Content-Type: text/html; charset=UTF-8

<
* Connection #0 to host www.google.com left intact

发现被拒绝了,换一台 是 ok 的,成功不成功主要看状态码 如果返回200 则 ok 如果403 则是被服务器拒绝了

➜  ~ curl -I www.google.com -v
* Rebuilt URL to: www.google.com/
*   Trying 172.10.100.128...
* TCP_NODELAY set
* Connected to www.google.com (172.10.100.128) port 80 (#0)
> HEAD / HTTP/1.1
> Host: www.google.com
> User-Agent: curl/7.51.0
> Accept: */*
>
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Date: Sun, 07 May 2017 07:49:20 GMT
Date: Sun, 07 May 2017 07:49:20 GMT
< Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips mod_fcgid/2.3.9
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips mod_fcgid/2.3.9
< Last-Modified: Sun, 07 May 2017 07:00:15 GMT
Last-Modified: Sun, 07 May 2017 07:00:15 GMT
< ETag: "7-54ee9acb5b2f4"
ETag: "7-54ee9acb5b2f4"
< Accept-Ranges: bytes
Accept-Ranges: bytes
< Content-Length: 7
Content-Length: 7
< Content-Type: text/html; charset=UTF-8
Content-Type: text/html; charset=UTF-8

<
* Curl_http_done: called premature == 0
* Connection #0 to host www.google.com left intact

基于密码访问

1.创建用户和密码

[root@server ~]# htpasswd -cm /etc/httpd/.apache_passwd admin
New password:
Re-type new password:
Adding password for user admin

查看密码文件

[root@server ~]# cat /etc/httpd/.apache_passwd
admin:$apr1$HxkN/yUw$2vggwJ3zpQqPCJA3lIgIN/

添加多个用户

[root@server ~]# htpasswd -m /etc/httpd/.apache_passwd root
New password:
Re-type new password:
Adding password for user root
[root@server ~]# cat /etc/httpd/.apache_passwd
admin:$apr1$HxkN/yUw$2vggwJ3zpQqPCJA3lIgIN/
root:$apr1$BWdtAYU5$kdWuP6LMniYr7L4yaaNho1

2.配置

<VirtualHost *:80>
    #ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/var/www/google/"
    ServerName www.google.com
    #ServerAlias www.dummy-host.example.com
    ErrorLog "/var/log/httpd/google.com-error_log"
    CustomLog "/var/log/httpd/google.com-access_log" common
    <Directory "/var/www/google">
      AuthType Basic #认证类型
      AuthName "Restricted Files" #显示的信息
      AuthUserFile /etc/httpd/.apache_passwd #密码文件位置
      Require user admin #允许的用户
   </Directory>
</VirtualHost>

3.直接访问,提示需要认证

[root@desktop ~]# curl -X GET http://www.google.com
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Unauthorized</title>
</head><body>
<h1>Unauthorized</h1>
<p>This server could not verify that you
are authorized to access the document
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
</body></html>

4.加用户名密码访问,并且由于只允许了 admin,所以,如果你使用 root 访问也会报401 认证错误

[root@desktop ~]# curl -X GET http://www.google.com  -u admin:123456 -v
* About to connect() to www.google.com port 80 (#0)
*   Trying 172.10.100.128...
* Connected to www.google.com (172.10.100.128) port 80 (#0)
* Server auth using Basic with user 'admin'
> GET / HTTP/1.1
> Authorization: Basic YWRtaW46MTIzNDU2
> User-Agent: curl/7.29.0
> Host: www.google.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Sun, 07 May 2017 08:09:17 GMT
< Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips mod_fcgid/2.3.9
< Last-Modified: Sun, 07 May 2017 07:00:15 GMT
< ETag: "7-54ee9acb5b2f4"
< Accept-Ranges: bytes
< Content-Length: 7
< Content-Type: text/html; charset=UTF-8
<
google
* Connection #0 to host www.google.com left intact

root 访问结果

[root@desktop ~]# curl -X GET http://www.google.com  -u root:123456 -v
* About to connect() to www.google.com port 80 (#0)
*   Trying 172.10.100.128...
* Connected to www.google.com (172.10.100.128) port 80 (#0)
* Server auth using Basic with user 'root'
> GET / HTTP/1.1
> Authorization: Basic cm9vdDoxMjM0NTY=
> User-Agent: curl/7.29.0
> Host: www.google.com
> Accept: */*
>
< HTTP/1.1 401 Unauthorized
< Date: Sun, 07 May 2017 08:09:54 GMT
< Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips mod_fcgid/2.3.9
* Authentication problem. Ignoring this.
< WWW-Authenticate: Basic realm="Restricted Files"
< Content-Length: 381
< Content-Type: text/html; charset=iso-8859-1
<
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Unauthorized</title>
</head><body>
<h1>Unauthorized</h1>
<p>This server could not verify that you
are authorized to access the document
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
</body></html>
* Connection #0 to host www.google.com left intact

通过浏览器访问

如果错误

输入正确的


常用状态码

  • 200 正常的请求
  • 206 数据还在发送
  • 301/302 跳转
  • 401 认证错误
  • 403 被服务器拒绝,一般开启了防盗链
  • 404 文件不存在
  • 503 服务器故障
  • 504 网关错误

可以参考 《HTTP 权威指南》

haproxy

haproxy 是一款开源的负载均衡器,类似的负载均衡器还有 lvs nginx 等。它是由c 语言编写的,提供了一个高可用、负载均衡,以及基于 tcp 和 http 协议的应用程序代理。

haproxy 的特点

HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

(1)HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的 并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
(2)HAProxy 实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
(3)HAProxy 支持连接拒绝 : 因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救
了很多站点,这个优点也是其它负载均衡器没有的。
(4)HAProxy 支持全透明代理(已具备硬件防火墙的典型特点): 可以用客户端IP地址或者任何其他地址来连接后端服务器. 这个特性仅在Linux 2.4/2.6内核打了cttproxy补丁后才可以使用. 这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。

haproxy 的性能

HAProxy借助于OS上几种常见的技术来实现性能的最大化。
1,单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。
2,O(1)事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测。
3,在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽;
4,借助于Linux 2.6 (>= 2.6.27.19)上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux 3.5及以上的OS中还可以实现零复制启动(zero-starting);
5,内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;
6,树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列;
7,优化的HTTP首部分析:优化的首部分析功能避免了在HTTP首部分析过程中重读任何内存区域;
8,精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;
所有的这些细微之处的优化实现了在中等规模负载之上依然有着相当低的CPU负载,甚至于在非常高的负载场景中,5%的用户空间占用率和95%的系统空间占用率也是非常普遍的现象,这意味着HAProxy进程消耗比系统空间消耗低20倍以上。因此,对OS进行性能调优是非常重要的。即使用户空间的占用率提高一倍,其CPU占用率也仅为10%,这也解释了为何7层处理对性能影响有限这一现象。由此,在高端系统上HAProxy的7层性能可轻易超过硬件负载均衡设备。
在生产环境中,在7层处理上使用HAProxy作为昂贵的高端硬件负载均衡设备故障故障时的紧急解决方案也时长可见。硬件负载均衡设备在“报文”级别处理请求,这在支持跨报文请求(request across multiple packets)有着较高的难度,并且它们不缓冲任何数据,因此有着较长的响应时间。对应地,软件负载均衡设备使用TCP缓冲,可建立极长的请求,且有着较大的响应时间。

安装

GitHub 地址https://github.com/haproxy/haproxy

1.编译安装

wget -c http://www.haproxy.org/download/1.7/src/haproxy-1.7.3.tar.gz

tar zxvf haproxy-1.7.3.tar.gz
cd haproxy-1.7.3
make TARGET=linux26 ARCH=x86_64 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
cd /usr/local/haproxy
mkdir /usr/local/haproxy/conf
cp examples/haproxy.cfg /conf

2.yum 安装

yum -y install haproxy

配置文件

# rpm -ql haproxy
/etc/haproxy
/etc/haproxy/haproxy.cfg
/etc/logrotate.d/haproxy
/etc/rc.d/init.d/haproxy
/etc/sysconfig/haproxy
/usr/bin/halog
/usr/bin/iprange
/usr/sbin/haproxy
/usr/share/doc/haproxy-1.5.4
/usr/share/doc/haproxy-1.5.4/CHANGELOG
/usr/share/doc/haproxy-1.5.4/LICENSE
/usr/share/doc/haproxy-1.5.4/README
/usr/share/doc/haproxy-1.5.4/acl-content-sw.cfg
/usr/share/doc/haproxy-1.5.4/acl.fig
/usr/share/doc/haproxy-1.5.4/architecture.txt
/usr/share/doc/haproxy-1.5.4/close-options.txt
/usr/share/doc/haproxy-1.5.4/coding-style.txt
/usr/share/doc/haproxy-1.5.4/configuration.txt
/usr/share/doc/haproxy-1.5.4/content-sw-sample.cfg
/usr/share/doc/haproxy-1.5.4/cookie-options.txt
/usr/share/doc/haproxy-1.5.4/cttproxy-src.cfg
/usr/share/doc/haproxy-1.5.4/design-thoughts
/usr/share/doc/haproxy-1.5.4/design-thoughts/backends-v0.txt
/usr/share/doc/haproxy-1.5.4/design-thoughts/backends.txt
/usr/share/doc/haproxy-1.5.4/design-thoughts/be-fe-changes.txt
/usr/share/doc/haproxy-1.5.4/design-thoughts/binding-possibilities.txt
/usr/share/doc/haproxy-1.5.4/design-thoughts/buffer-redesign.txt
/usr/share/doc/haproxy-1.5.4/design-thoughts/buffers.fig
/usr/share/doc/haproxy-1.5.4/design-thoughts/config-language.txt
/usr/share/doc/haproxy-1.5.4/design-thoughts/connection-reuse.txt
/usr/share/doc/haproxy-1.5.4/design-thoughts/cttproxy-changes.txt
/usr/share/doc/haproxy-1.5.4/design-thoughts/entities-v2.txt
/usr/share/doc/haproxy-1.5.4/design-thoughts/how-it-works.txt
/usr/share/doc/haproxy-1.5.4/design-thoughts/http_load_time.url
/usr/share/doc/haproxy-1.5.4/design-thoughts/rate-shaping.txt
/usr/share/doc/haproxy-1.5.4/design-thoughts/sess_par_sec.txt
/usr/share/doc/haproxy-1.5.4/gpl.txt
/usr/share/doc/haproxy-1.5.4/haproxy-en.txt
/usr/share/doc/haproxy-1.5.4/haproxy-fr.txt
/usr/share/doc/haproxy-1.5.4/haproxy.1
/usr/share/doc/haproxy-1.5.4/haproxy.cfg
/usr/share/doc/haproxy-1.5.4/internals
/usr/share/doc/haproxy-1.5.4/internals/acl.txt
/usr/share/doc/haproxy-1.5.4/internals/body-parsing.txt
/usr/share/doc/haproxy-1.5.4/internals/buffer-operations.txt
/usr/share/doc/haproxy-1.5.4/internals/buffer-ops.fig
/usr/share/doc/haproxy-1.5.4/internals/connect-status.txt
/usr/share/doc/haproxy-1.5.4/internals/connection-header.txt
/usr/share/doc/haproxy-1.5.4/internals/connection-scale.txt
/usr/share/doc/haproxy-1.5.4/internals/entities.fig
/usr/share/doc/haproxy-1.5.4/internals/entities.pdf
/usr/share/doc/haproxy-1.5.4/internals/entities.svg
/usr/share/doc/haproxy-1.5.4/internals/entities.txt
/usr/share/doc/haproxy-1.5.4/internals/hashing.txt
/usr/share/doc/haproxy-1.5.4/internals/header-parser-speed.txt
/usr/share/doc/haproxy-1.5.4/internals/header-tree.txt
/usr/share/doc/haproxy-1.5.4/internals/http-cookies.txt
/usr/share/doc/haproxy-1.5.4/internals/http-docs.txt
/usr/share/doc/haproxy-1.5.4/internals/http-parsing.txt
/usr/share/doc/haproxy-1.5.4/internals/naming.txt
/usr/share/doc/haproxy-1.5.4/internals/pattern.dia
/usr/share/doc/haproxy-1.5.4/internals/pattern.pdf
/usr/share/doc/haproxy-1.5.4/internals/polling-states.fig
/usr/share/doc/haproxy-1.5.4/internals/repartition-be-fe-fi.txt
/usr/share/doc/haproxy-1.5.4/internals/sequence.fig
/usr/share/doc/haproxy-1.5.4/internals/stats-v2.txt
/usr/share/doc/haproxy-1.5.4/internals/stream-sock-states.fig
/usr/share/doc/haproxy-1.5.4/internals/todo.cttproxy
/usr/share/doc/haproxy-1.5.4/lgpl.txt
/usr/share/doc/haproxy-1.5.4/proxy-protocol.txt
/usr/share/doc/haproxy-1.5.4/queuing.fig
/usr/share/doc/haproxy-1.5.4/tarpit.cfg
/usr/share/doc/haproxy-1.5.4/url-switching.cfg
/usr/share/haproxy
/usr/share/haproxy/400.http
/usr/share/haproxy/403.http
/usr/share/haproxy/408.http
/usr/share/haproxy/500.http
/usr/share/haproxy/502.http
/usr/share/haproxy/503.http
/usr/share/haproxy/504.http
/usr/share/haproxy/README
/usr/share/man/man1/halog.1.gz
/usr/share/man/man1/haproxy.1.gz
/var/lib/haproxy

配置

haproxy 的配置文件由两部分组成:全局设定和对代理的设定,共分为五段:global,defaults,frontend,backend,listen。

###########全局配置#########  
global  
    log 127.0.0.1   local0 #[日志输出配置,所有日志都记录在本机,通过local0输出]  
    log 127.0.0.1   local1 notice  #定义haproxy 日志级别[error warringinfo debug]  
        daemon      #以后台形式运行harpoxy  
        nbproc 1   #设置进程数量  
        pidfile /home/haproxy/haproxy/conf/haproxy.pid   #haproxy 进程PID文件  
    ulimit-n 819200   #ulimit 的数量限制  
    maxconn 4096    #默认最大连接数,需考虑ulimit-n限制  
        #chroot /usr/share/haproxy #chroot运行路径  
    uid 99                    #运行haproxy 用户 UID  
        gid 99                    #运行haproxy 用户组gid  
        #debug      #haproxy 调试级别,建议只在开启单进程的时候调试  
        #quiet  

########默认配置############  
defaults  
    log global  
        mode http               #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK  
        option  httplog         #日志类别,采用httplog  
    option  dontlognull     #不记录健康检查日志信息  
    retries 2               #两次连接失败就认为是服务器不可用,也可以通过后面设置  
    option  forwardfor   #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip  
    option  httpclose    #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现  
        #option redispatch       #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器,以后将不支持  
        option abortonclose     #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接  
        maxconn 4096            #默认的最大连接数  
        timeout connect  5000ms  #连接超时  
        timeout client 30000ms  #客户端超时  
        timeout server 30000ms  #服务器超时  
        #timeout check 2000      #心跳检测超时  
    #timeout http-keep-alive10s   #默认持久连接超时时间  
    #timeout http-request   10s   #默认http请求超时时间  
        #timeoutqueue          1m     #默认队列超时时间  
    balance roundrobin    #设置默认负载均衡方式,轮询方式  
        #balance source        # 设置默认负载均衡方式,类似于nginx的ip_hash  
        #balnace leastconn     #设置默认负载均衡方式,最小连接数  

########统计页面配置########  
listen admin_stats  
        bind 0.0.0.0:1080               #设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称  
        mode http                       #http的7层模式  
        option httplog                  #采用http日志格式  
        #log 127.0.0.1 local0 err       #错误日志记录  
        maxconn 10                      #默认的最大连接数  
        stats refresh 30s               #统计页面自动刷新时间  
        stats uri /stats                #统计页面url  
        stats realm XingCloud\ Haproxy  #统计页面密码框上提示文本  
        stats auth admin:admin     #设置监控页面的用户和密码:admin,可以设置多个用户名  
        stats auth  Frank:Frank   #设置监控页面的用户和密码:Frank  
        stats hide-version              #隐藏统计页面上HAProxy的版本信息  
    stats  admin if TRUE       #设置手工启动/禁用,后端服务器(haproxy-1.4.9以后版本)  

########设置haproxy 错误页面#####  
errorfile 403  /home/haproxy/haproxy/errorfiles/403.http  
errorfile 500 /home/haproxy/haproxy/errorfiles/500.http  
errorfile 502 /home/haproxy/haproxy/errorfiles/502.http  
errorfile 503 /home/haproxy/haproxy/errorfiles/503.http  
errorfile 504 /home/haproxy/haproxy/errorfiles/504.http  

########frontend前端配置##############  
bind *:80  
    #这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。  
    acl web hdr(host) -i www.abc.com  
    #acl后面是规则名称,-i是要访问的域名,  
    acl img hdr(host) -i img.abc.com  
    如果访问www.abc.com这个域名就分发到下面的webserver 的作用域。  
    #如果访问img.abc.com.cn就分发到imgserver这个作用域。  
    use_backend webserver if web  
    use_backend imgserver if img  

########backend后端配置##############  
backend webserver             #webserver作用域  
    mode http  
    balance   roundrobin        
    #banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数  
    option  httpchk /index.html HTTP/1.0  #健康检查  
    #检测文件,如果分发到后台index.html访问不到就不再分发给它  
    server  web1 10.16.0.9:8085 cookie 1 weight 5 check inter 2000 rise 2 fall 3  
    server  web2 10.16.0.10:8085 cookie 2 weight 3 check inter 2000 rise 2 fall 3  
    #cookie 1表示serverid为1,check inter 1500 是检测心跳频率    
    #rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重  
backend imgserver  
    mode http  
    option  httpchk /index.php  
    balance     roundrobin                            
    server      img01 192.168.137.101:80  check inter 2000 fall 3  
    server      img02 192.168.137.102:80  check inter 2000 fall 3  

########tcp配置#################  
listen test1  
        bind 0.0.0.0:90  
        mode tcp  
    option  tcplog          #日志类别,采用tcplog  
        maxconn 4086  
        #log 127.0.0.1 local0 debug  
        server s1 10.18.138.201:80  weight 1  
        server s2 10.18.102.190:80  weight 1 

正则表达式

元字符

代码说明
.匹配除换行符意外的任意字符
\w匹配字母或数字或下划线或汉字
\s匹配任意的空白字符
\d匹配数字
\b匹配单词的开始或者结束
^匹配单词的开始
$匹配字符串的结束

字符转义

如果要想查元字符的话,比如要匹配www.baidu.com,那么由于.已经被用做元字符了,所以你需要\.这样转义下才能匹配到.

重复

代码/语法说明
*重复零次或更多次
+重复一次或更多次
重复零次或一次
{n}重复 n 次
{n,}重复 n 次货更多次
{n,m}重复 n 到 m 次

分支条件

比如我们需要同时匹配(010)223242322和0559-222341242,我们通常使用|来进行区分,正则如下:

(0?\d{4}-\d{8})|(\(0\d{2}\)\d{8})

分组

比如,我们要匹配 ip 地址221.222.123.223,我们就需要使用分组,通常我们使用小括号来指定子表达式,然后可以指定这个子表达式的重复次数

(\d{1,3}\.)\d{1,}

但是,这样,我们匹配到的也可能是300.300.300.300这样的不可能存在的 ip 地址,所以,我们只能使用冗长的分组

((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

反义

代码/语法说明
\W匹配任意不是字母,数字,下划线,汉子的字符
\S匹配任意不是空白的字符
\D匹配任意非数字的字符
\B匹配不是单词开头或结束的位置
[^x]匹配除了x 以外的任意字符
[^aeiou]匹配除了 aeiou 这几个字母以外的任意字符

举例,我们有一条字符串cv?uuid=9f0d65cf6ba397d5b5cb0c9aa0c12df1&tc=113283078&p=kxescore.exe&c=1335&f=json

我们要匹配不包含f=json以外的内容,正则表达式如下:

[^(f=json)]

文本处理三剑客

awk

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。

awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

使用

awk 其实是 gawk 的一个连接

[root@OpenStack ~]# which awk
/bin/awk
[root@OpenStack ~]# cd /bin/
[root@OpenStack bin]# ll awk
lrwxrwxrwx. 1 root root 4 3月  14 19:39 awk -> gawk

用法

awk [options]  'program' {filenames}

program格式:’{pattern + action}’ 语句之间用分号分割

选项:

-F 指明输入时用到的字段分隔符
-v 用于实现自定义变量,格式:var=value

awk 的实现方式

awk 会把需要处理的文本进行切片,切割成片段后 可以使用$1-$n 的方式来显示切割后的行,第一行为$1,第二行为$2,以此类推,全文输入则使用$0,此外,处理完毕后,我们还可以加入条件判断,总的来说 awk 其实也是一门编程语言。

1.打印第一行

[root@OpenStack bin]# awk '{print $1}' /etc/fstab

我们可以使用 print 输出某行,格式是print item1,item2,…

2.打印多行

[root@OpenStack bin]# awk '{print $1,$3}' /etc/passwd

lvs

理论知识

详见:http://www.linuxvirtualserver.org/VS-NAT.html

三台设备的配置

lvs master

[root@node-lvs-master ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:8C:65:5C  
          inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe8c:655c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:174 errors:0 dropped:0 overruns:0 frame:0
          屯溪 packets:146 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:19375 (18.9 KiB)  屯溪 bytes:12672 (12.3 KiB)

eth1      Link encap:Ethernet  HWaddr 00:50:56:26:3F:BF  
          inet addr:10.2.100.128  Bcast:10.2.100.255  Mask:255.255.255.0
          inet6 addr: fe80::250:56ff:fe26:3fbf/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6929 errors:0 dropped:0 overruns:0 frame:0
          屯溪 packets:4205 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:9435708 (8.9 MiB)  屯溪 bytes:303237 (296.1 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          屯溪 packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:186 (186.0 b)  屯溪 bytes:186 (186.0 b)

node-nginx-1

[root@node-nginx-1 www]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:FD:96:34  
          inet addr:10.2.100.129  Bcast:10.2.100.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fefd:9634/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:89621 errors:0 dropped:0 overruns:0 frame:0
          屯溪 packets:38543 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:127372167 (121.4 MiB)  屯溪 bytes:3185368 (3.0 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:347 errors:0 dropped:0 overruns:0 frame:0
          屯溪 packets:347 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:38092 (37.1 KiB)  屯溪 bytes:38092 (37.1 KiB)

node-nginx-2

[root@localhost html]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:4C:5E:CF  
          inet addr:10.2.100.130  Bcast:10.2.100.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe4c:5ecf/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:88038 errors:0 dropped:0 overruns:0 frame:0
          屯溪 packets:35860 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:127247313 (121.3 MiB)  屯溪 bytes:2946395 (2.8 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          屯溪 packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:672 (672.0 b)  屯溪 bytes:672 (672.0 b)

两台Real Server 的GATEWAY需设置为Director Server(node-lvs-master)的内网地址10.2.100.128

master 开启地址转发

[root@node-lvs-master ~]# vi /etc/sysctl.conf 
net.ipv4.ip_forward = 1
[root@node-lvs-master ~]# sysctl -p

安装lvs

[root@node-lvs-master ~]# yum -y install ipvsadm

注意:最好关闭所有设备的iptables和selinux

[root@node-lvs-master ~]# /etc/init.d/iptables stop
[root@node-lvs-master ~]# setenforce 0 #临时关闭
[root@node-lvs-master ~]# vi /etc/selinux/config 

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing //改为disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 

配置lvs

[root@node-lvs-master ~]# ipvsadm -C
[root@node-lvs-master ~]# ipvsadm -A -t 192.168.1.100:80 -s wlc
[root@node-lvs-master ~]# ipvsadm -a -t 192.168.1.100:80 -r 10.2.100.129:80 -m
[root@node-lvs-master ~]# ipvsadm -a -t 192.168.1.100:80 -r 10.2.100.130:80 -m
[root@node-lvs-master ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.100:http wlc
  -> 10.2.100.129:http            Masq    1      0          0         
  -> 10.2.100.130:http            Masq    1      0          0    

多刷新几次,ctrl+shift+r强制刷新,然后再看

[root@node-lvs-master ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.100:http wlc
  -> 10.2.100.129:http            Masq    1      0          0         
  -> 10.2.100.130:http            Masq    1      0          0         
[root@node-lvs-master ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.100:http wlc
  -> 10.2.100.129:http            Masq    1      0          1         
  -> 10.2.100.130:http            Masq    1      1          1         
[root@node-lvs-master ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.100:http wlc
  -> 10.2.100.129:http            Masq    1      0          12        
  -> 10.2.100.130:http            Masq    1      1          13 

lvs的算法

常见的有八种

  • 轮询调度:RR 按依次循环的方式请求调度到不同的服务器,特点是简单,平均分配给每台服务器
  • 加权轮询调度:WRR,对RR的一种补充和优化,给每台服务器一个权重,假如A为1,B为2,则优先调度A,权重值越高处理的请求越多
  • 最小连接调度:LC,把请求调度到连接数最小的服务器上
  • 加权最小连接调度 WLC,给每个服务器一个权值,调度尽可能保证每台服务器的均衡
  • 基于局部性最少的连接:lblc,请求数据包的目标IP地址的一种调度算法,先根据目标IP地址寻找最近的该目标地址的所使用的服务器,如果服务器可用并且有能力处理请求,则调度算法会尽可能的选择相同的服务器,否则选择其他
  • 带复制的基于局部性的最少连接:lblcr,它记录的不是一个目标IP与另外一台服务器直接的连接记录,它维护的是一个目标IP到一组服务器直接的映射关系,防止单点负载过高
  • 目标地址散列调度:DH,根据目标地址通过散列函数将目标IP与服务器建立映射关系,出现服务器不可用或负载高,发往该服务器的请求会会固定发往该服务器。
  • 源地址散列调度:SH,与上面的类似,但是它是根据源地址散列算法进行静态分配固定的服务器资源。

##ipvs的命令详解

选项:

选项:

-A 添加一个虚拟服务,使用IP地址、端口号、协议来唯一定义一个虚拟服务
-E 编辑一个虚拟服务
-D 删除一个虚拟服务
-C 清空虚拟服务
-R 从标准输入中还原虚拟服务规则
-S 保存虚拟服务规则到标准输出,输入的规则可以使用-R导入还原
-a 在虚拟服务中添加一个真实的服务器
-e 在虚拟服务中编辑一台真是的服务器
-d 在虚拟的服务中删除一台真是的服务器
-L 显示虚拟服务器列表
-t 使用tcp协议,该参数后需跟主机与端口
-u 使用UDP,该参数后需跟主机与端口
-s 使用LVS所采用的调度算法
-r 设置真是服务器的IP和端口信息
-g 设置LVS工作模式为DR直连路由模式
-i 设置LVS工作模式为TUN隧道模式
-m 设置LVS的工作模式为NAT模式
-w 设置服务器的权重
-c 链接状态 需要配合L使用
-n 数字格式输出


ffmpeg

ffmpeg 转h264文件为h265格式

命令

ffmpeg -i gopro.mp4 -c:v libx265 -c:a copy out.mp4

压缩后对比2个文件大小

➜  Downloads ll gopro.mp4 out.mp4
-rw-r--r--@ 1 wenjun  staff    79M  4 19 19:00 gopro.mp4
-rw-r--r--  1 wenjun  staff    40M  4 27 13:56 out.mp4

一个79M 一个40M

没有libx265模块,先查看下

➜  Downloads brew info ffmpeg
ffmpeg: stable 3.3 (bottled), HEAD
Play, record, convert, and stream audio and video
https://ffmpeg.org/
/usr/local/Cellar/ffmpeg/3.2.4 (244 files, 52.0MB)
  Built from source on 2017-04-11 at 14:38:41 with: --with-sdl2
/usr/local/Cellar/ffmpeg/3.3 (248 files, 53MB) *
  Built from source on 2017-04-27 at 13:41:58 with: --with-x265
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/ffmpeg.rb
==> Dependencies
Build: pkg-config ✔, texi2html ✔, yasm ✔
Recommended: lame ✔, x264 ✔, xvid ✔
Optional: chromaprint ✘, fdk-aac ✘, fontconfig ✘, freetype ✔, frei0r ✘, game-music-emu ✘, libass ✘, libbluray ✘, libbs2b ✘, libcaca ✘, libgsm ✘, libmodplug ✘, libsoxr ✘, libssh ✘, libvidstab ✘, libvorbis ✔, libvpx ✘, opencore-amr ✘, openh264 ✘, openjpeg ✘, openssl ✔, opus ✘, rtmpdump ✔, rubberband ✘, schroedinger ✘, sdl2 ✔, snappy ✘, speex ✘, tesseract ✘, theora ✘, two-lame ✘, wavpack ✘, webp ✔, x265 ✔, xz ✔, zeromq ✘, zimg ✘
==> Options
--with-chromaprint
    Enable the Chromaprint audio fingerprinting library
--with-fdk-aac
    Enable the Fraunhofer FDK AAC library
--with-fontconfig
    Build with fontconfig support
--with-freetype
    Build with freetype support
--with-frei0r
    Build with frei0r support
--with-game-music-emu
    Build with game-music-emu support
--with-libass
    Enable ASS/SSA subtitle format
--with-libbluray
    Build with libbluray support
--with-libbs2b
    Build with libbs2b support
--with-libcaca
    Build with libcaca support
--with-libgsm
    Build with libgsm support
--with-libmodplug
    Build with libmodplug support
--with-libsoxr
    Enable the soxr resample library
--with-libssh
    Enable SFTP protocol via libssh
--with-libvidstab
    Enable vid.stab support for video stabilization
--with-libvorbis
    Build with libvorbis support
--with-libvpx
    Build with libvpx support
--with-opencore-amr
    Enable Opencore AMR NR/WB audio format
--with-openh264
    Enable OpenH264 library
--with-openjpeg
    Enable JPEG 2000 image format
--with-openssl
    Enable SSL support
--with-opus
    Build with opus support
--with-rtmpdump
    Enable RTMP protocol
--with-rubberband
    Enable rubberband library
--with-schroedinger
    Enable Dirac video format
--with-sdl2
    Enable FFplay media player
--with-snappy
    Enable Snappy library
--with-speex
    Build with speex support
--with-tesseract
    Enable the tesseract OCR engine
--with-theora
    Build with theora support
--with-tools
    Enable additional FFmpeg tools
--with-two-lame
    Build with two-lame support
--with-wavpack
    Build with wavpack support
--with-webp
    Enable using libwebp to encode WEBP images
--with-x265
    Enable x265 encoder
--with-xz
    Enable decoding of LZMA-compressed TIFF files
--with-zeromq
    Enable using libzeromq to receive commands sent through a libzeromq client
--with-zimg
    Enable z.lib zimg library
--without-lame
    Disable MP3 encoder
--without-qtkit
    Disable deprecated QuickTime framework
--without-securetransport
    Disable use of SecureTransport
--without-x264
    Disable H.264 encoder
--without-xvid
    Disable Xvid MPEG-4 video encoder
--HEAD
    Install HEAD version

看x265 ✔这里是不是有 ✔,如果没有,则先卸载

brew uninstall ffmpeg

然后

brew install ffmpeg  --with-x265

如果需要其他模块,也要自己安装

使用 ffmpeg 截图和转码

剪辑视频

ffmpeg -ss 00:00:00 -t 00:00:09 -y -i gopro.mp4 -vcodec copy -acodec copy test1.mp4

说明:上面的这个例子是将gopro.mp4视频的前9秒,重新生成一个新视频。
-ss 开始时间,如: 00:00:00,表示从0秒开始,格式也可以00:00:0
-t 时长,如: 00:00:09,表示截取3秒长的视频,格式也可以00:00: 9
-y 如果文件已存在强制替换;
-i 输入,后面是空格,紧跟着就是输入视频文件;
-vcodec copy 和 -acodec copy表示所要使用的视频和音频的编码格式,这里指定为copy表示原样拷贝;

转码

1.将文件 gorpo.mp4 转换成 out.m3u8

ffmpeg -i gopro.mp4 -vcodec copy -acodec copy out.m3u8

截图

  1. 每10秒截图一次

    ffmpeg -i gopro.mp4 -f image2 -vf fps=fps=1/10 out%d.png!awen

2.每秒截图一次

ffmpeg -i gopro.mp4 -f image2 -vf fps=fps=1 out%d.png!awen

3.从第10秒开始截图100张 保存大小为1280*720 保存格式为 b-时间.jpg!awen

ffmpeg -ss 10 -i gopro.mp4 -y -f image2 -vframes 100 -s 1280x720 b-%d.jpg!awen

使用ffmpeg 设置水印的位置

水印在左上角:

ffmpeg -i gopro.mp4 -i 168-50.png!awen -filter_complex "overlay=10:10" -codec:a copy output.mp4  

其中10:10 可以指定 x、y 坐标的位置

具体如下:

➜  Downloads ffmpeg -i gopro.mp4 -i 168-50.png!awen -filter_complex "overlay=main_w-overlay_w-20:20" -codec:a copy output.mp4
ffmpeg version 3.2.4 Copyright (c) 2000-2017 the FFmpeg developers
  built with Apple LLVM version 8.1.0 (clang-802.0.38)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/3.2.4 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda
  libavutil      55. 34.101 / 55. 34.101
  libavcodec     57. 64.101 / 57. 64.101
  libavformat    57. 56.101 / 57. 56.101
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libavresample   3.  1.  0 /  3.  1.  0
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
  libpostproc    54.  1.100 / 54.  1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'gopro.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.25.100
  Duration: 00:04:13.98, start: 0.000000, bitrate: 2610 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 2474 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
Input #1, png_pipe, from '168-50.png!awen':
  Duration: N/A, bitrate: N/A
    Stream #1:0: Video: png, rgba(pc), 168x50 [SAR 5669:5669 DAR 84:25], 25 tbr, 25 tbn, 25 tbc
File 'output.mp4' already exists. Overwrite ? [y/N] y 输入 y 继续
[libx264 @ 0x7fbac900c400] using SAR=1/1
[libx264 @ 0x7fbac900c400] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 AVX2 LZCNT BMI2
[libx264 @ 0x7fbac900c400] profile High, level 3.1
[libx264 @ 0x7fbac900c400] 264 - core 148 r2748 97eaef2 - H.264/MPEG-4 AVC codec - Copyleft 2003-2016 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
Output #0, mp4, to 'output.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.56.101
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=-1--1, 29.97 fps, 30k tbn, 29.97 tbc (default)
    Metadata:
      encoder         : Lavc57.64.101 libx264
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
    Stream #0:1(und): Audio: aac (LC) ([64][0][0][0] / 0x0040), 44100 Hz, stereo, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
Stream mapping:
  Stream #0:0 (h264) -> overlay:main
  Stream #1:0 (png) -> overlay:overlay
  overlay -> Stream #0:0 (libx264)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 7610 fps= 36 q=-1.0 Lsize=   77794kB time=00:04:13.93 bitrate=2509.7kbits/s speed=1.19x
video:73560kB audio:3970kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.340952%
[libx264 @ 0x7fbac900c400] frame I:125   Avg QP:19.08  size: 58060
[libx264 @ 0x7fbac900c400] frame P:2658  Avg QP:22.50  size: 15608
[libx264 @ 0x7fbac900c400] frame B:4827  Avg QP:24.71  size:  5507
[libx264 @ 0x7fbac900c400] consecutive B-frames:  6.7% 18.7% 22.4% 52.2%
[libx264 @ 0x7fbac900c400] mb I  I16..4: 23.2% 43.3% 33.5%
[libx264 @ 0x7fbac900c400] mb P  I16..4:  6.5% 15.0%  3.2%  P16..4: 32.5%  9.7%  3.8%  0.0%  0.0%    skip:29.3%
[libx264 @ 0x7fbac900c400] mb B  I16..4:  1.1%  2.6%  0.8%  B16..8: 31.4%  4.2%  0.8%  direct: 1.6%  skip:57.6%  L0:44.2% L1:49.6% BI: 6.2%
[libx264 @ 0x7fbac900c400] 8x8 transform intra:57.9% inter:64.8%
[libx264 @ 0x7fbac900c400] coded y,uvDC,uvAC intra: 41.4% 44.0% 9.7% inter: 8.7% 8.6% 0.4%
[libx264 @ 0x7fbac900c400] i16 v,h,dc,p: 19% 32% 13% 36%
[libx264 @ 0x7fbac900c400] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 23% 25% 24%  4%  5%  4%  6%  4%  6%
[libx264 @ 0x7fbac900c400] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 21% 23% 16%  6%  8%  7%  8%  5%  7%
[libx264 @ 0x7fbac900c400] i8c dc,h,v,p: 58% 23% 15%  5%
[libx264 @ 0x7fbac900c400] Weighted P-Frames: Y:8.4% UV:4.1%
[libx264 @ 0x7fbac900c400] ref P L0: 66.7% 18.0% 10.7%  4.3%  0.3%
[libx264 @ 0x7fbac900c400] ref B L0: 88.5%  9.6%  1.8%
[libx264 @ 0x7fbac900c400] ref B L1: 98.3%  1.7%
[libx264 @ 0x7fbac900c400] kb/s:2373.17

水印在右上角:

ffmpeg -i gopro.mp4 -i 168-50.png!awen -filter_complex "overlay=main_w-overlay_w-10:10"  -codec:a copy output.mp4    

水印在左下角:

ffmpeg -i gopro.mp4 -i 168-50.png!awen -filter_complex "overlay=10:main_h-overlay_h-10“  -codec:a copy output.mp4

水印在右下角:

ffmpeg -i gopro.mp4 -i 168-50.png!awen -filter_complex "overlay=main_w-overlay_w-10:main_h-overlay_h-10“  -codec:a copy output.mp4

水印在中间:

ffmpeg -i gopro.mp4 -i 168-50.png!awen -filter_complex "overlay=main_w/2-overlay_w/2:main_h/2-overlay_h/2“  -codec:a copy output.mp4

播放

➜  Downloads ffplay gopro.mp4
ffplay version 3.2.4 Copyright (c) 2003-2017 the FFmpeg developers
  built with Apple LLVM version 8.1.0 (clang-802.0.38)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/3.2.4 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda
  libavutil      55. 34.101 / 55. 34.101
  libavcodec     57. 64.101 / 57. 64.101
  libavformat    57. 56.101 / 57. 56.101
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libavresample   3.  1.  0 /  3.  1.  0
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
  libpostproc    54.  1.100 / 54.  1.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'gopro.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.25.100
  Duration: 00:04:13.98, start: 0.000000, bitrate: 2610 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 2474 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 59.94 tbc (default)
    Metadata:
      handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
  12.36 A-V: -0.008 fd=  36 aq=   19KB vq=   69KB sq=    0B f=0/0

使用 FFmpeg 和 ffplay 推拉流

推流

➜  Downloads ffmpeg -re -i Big\ Buck\ Bunny-YE7VzlLtp-4.mp4 -vcodec copy -f flv rtmp://uplive.v0.v5linux.com/live/lol
  ffmpeg version 3.2-tessus Copyright (c) 2000-2016 the FFmpeg developers
    built with Apple LLVM version 8.0.0 (clang-800.0.38)
    configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libass --enable-libbluray --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-libschroedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzmq --enable-version3 --disable-ffplay --disable-indev=qtkit --disable-indev=x11grab_xcb
    libavutil      55. 34.100 / 55. 34.100
    libavcodec     57. 64.100 / 57. 64.100
    libavformat    57. 56.100 / 57. 56.100
    libavdevice    57.  1.100 / 57.  1.100
    libavfilter     6. 65.100 /  6. 65.100
    libswscale      4.  2.100 /  4.  2.100
    libswresample   2.  3.100 /  2.  3.100
    libpostproc    54.  1.100 / 54.  1.100
  Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Big Buck Bunny-YE7VzlLtp-4.mp4':
    Metadata:
      major_brand     : isom
      minor_version   : 512
      compatible_brands: isomiso2avc1mp41
      encoder         : Lavf57.56.100
    Duration: 00:09:56.57, start: 0.000000, bitrate: 1443 kb/s
      Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], 1312 kb/s, 24 fps, 24 tbr, 90k tbn, 48 tbc (default)
      Metadata:
        handler_name    : VideoHandler
      Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)
      Metadata:
        handler_name    : SoundHandler
  Output #0, flv, to 'rtmp://test.v0.v5linux.com/live/lol':
    Metadata:
      major_brand     : isom
      minor_version   : 512
      compatible_brands: isomiso2avc1mp41
      encoder         : Lavf57.56.100
      Stream #0:0(und): Video: h264 (Main) ([7][0][0][0] / 0x0007), yuv420p, 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 1312 kb/s, 24 fps, 24 tbr, 1k tbn, 90k tbc (default)
      Metadata:
        handler_name    : VideoHandler
      Stream #0:1(und): Audio: mp3 (libmp3lame) ([2][0][0][0] / 0x0002), 44100 Hz, stereo, fltp (default)
      Metadata:
        handler_name    : SoundHandler
        encoder         : Lavc57.64.100 libmp3lame
  Stream mapping:
    Stream #0:0 -> #0:0 (copy)
    Stream #0:1 -> #0:1 (aac (native) -> mp3 (libmp3lame))
  Press [q] to stop, [?] for help
  frame=  502 fps= 24 q=-1.0 Lsize=    4094kB time=00:00:20.87 bitrate=1606.7kbits/s speed=   1x

拉流

➜  ~ ffplay rtmp://uplive.b0.v5linux.com/live/lol
ffplay version 3.2-tessus Copyright (c) 2003-2016 the FFmpeg developers
  built with Apple LLVM version 8.0.0 (clang-800.0.38)
  configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libass --enable-libbluray --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-libschroedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzmq --enable-version3 --enable-librtmp --enable-ffplay --enable-sdl2 --disable-ffmpeg --disable-ffprobe --disable-ffserver --disable-indev=qtkit --disable-indev=x11grab_xcb
  libavutil      55. 34.100 / 55. 34.100
  libavcodec     57. 64.100 / 57. 64.100
  libavformat    57. 56.100 / 57. 56.100
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
  libpostproc    54.  1.100 / 54.  1.100
Metadata:  :  0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0
  width                 1280.00
  height                720.00
  videodatarate         1282.04
  framerate             24.00
  videocodecid          7.00
  audiodatarate         0.00
  audiosamplerate       44100.00
  audiosamplesize       16.00
  stereo                TRUE
  audiocodecid          2.00
  major_brand           isom
  minor_version         512
  compatible_brands     isomiso2avc1mp41
  encoder               Lavf57.56.100
  server                UPYUN/4.0.169(BMS)
  srs_primary           UPYUN/4.0release
  srs_authors           Chnvideo
  server_version        4.0.169
  srs_pid               1120781.00
  srs_id                429208.00
  srs_server_ip         183.158.35.6
[flv @ 0x7f852207de00] audio stream discovered after head already parsed
[flv @ 0x7f852207de00] video stream discovered after head already parsed
Input #0, flv, from 'rtmp://test.b0.v5linux.com/live/lol':B f=0/0
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.56.100
    server          : UPYUN/4.0.169(BMS)
    srs_primary     : UPYUN/4.0release
    srs_authors     : Chnvideo
    server_version  : 4.0.169
    srs_pid         : 1120781
    srs_id          : 429208
    srs_server_ip   : 183.158.35.6
  Duration: N/A, start: 0.014000, bitrate: N/A
    Stream #0:0: Audio: mp3, 44100 Hz, stereo, s16p, 128 kb/s
    Stream #0:1: Video: h264 (Main), yuv420p(progressive), 1280x720 [SAR 1:1 DAR 16:9], 24.42 fps, 24 tbr, 1k tbn, 48 tbc