CentOS是一个流行的企业级Linux发行版本,而Linux则是一个类UNIX系统,在UNIX/类UNIX系统中,信息组织的基本单位称作文件,并且计算机所有软硬件资源都可以抽象成文件,这就是常说的Everything is a file(一切皆文件),并且制定出UNIX文件系统参考标准HFS(Hierarchical File System)后来HFS又被纳入到Linux基金会制定的Linux标准规范LSB(Linux Standard Base)标准之中,每个遵循LSB标准的Linux发行版本都采用类似的文件系统结构,但不会完全相同。

一切皆文件这一理念对于Windows的用户来说有点古怪,文件是文件,设备就是设备,怎么都可能都是文件呢?但这一理念对于CentOS而言,却再自然不过了,软硬件全都抽象为文件来管理,如将所有的I/O设备被分为块设备文件和字符设备文件,都与/dev目录下特殊文件联系在一起,用户无需了解硬件设备的读写方式,只需像操作普通文件一样操作特殊文件,即可达到访问I/O设备的目的。例如,读取特殊文件相当于从硬件设备中直接读出数据,写特殊文件则相当于直接向硬件设备发送数据。

CentOS文件系统就是采用一种逻辑的方法组织、存储、访问、操作和管理信息,把文件组织在一个层次目录结构的文件系统中,每个目录包含一组相关文件的组合,每个文件一般都提供打开文件(open)、创建文件(create)、读文件(read)和写文件(write)等基本操作。

最终,CentOS通过其文件系统,对所有文件进行管理和控制,具体说来,即实现了CentOS对软硬件的统一管理和控制,提供了一种通用的文件处理模式,这一设计堪称化繁为简的经典,简化物理设备的访问,按文件方式处理物理设备,允许用户以同样的命令处理普通文件和物理设备。例如磁盘存储设备被视为一个块设备为件,而在键盘,鼠标和显示器则被视为字符设备文件。而Windows的文件系统则比较单纯,只是一个存储概念,用于存储各种文件并根据分区为单位创建。

个人经验,要尽快扎实地掌握CentOS 8,要从文件加命令行的核心思路,从Linux的文件和命令行两方面入手,深入理解Linx文件的概念及结构,反复使用掌握命令行及Shell开发这些强大的系统管理工具,反复理解和练习,当然,困难还是有的,首先就是理论体系十分庞杂,其次是命令行的掌握十分枯燥,下面就来抓住重点并一一化解。

2.1 掌握CentOS文件系统

2.1.1 CentOS文件层次结构

从CentOS使用者的角度看,CentOS的文件系统只是一个树形层次组织结构的目录文件树,CentOS就是根据这棵树来管理和组织服务器系统的软硬件资源,因为CentOS中一切皆文件,无论是软件还是硬件,最终都会被抽象为文件,这一点和Windows系统存在很大不同,文件系统在Windows中就是一个存储。至于文件系统的起点根据用户身份的不同而不同,如超级用户root的家目录是root,而普通用户的家目录则是/home目录下和用户名相同的目录。所有的目录无论其类型如何,规格到底都是要直接,间接,自动,手动地挂载到根目录/之上的,这个也和大树的层级结构比较类似,大树层级结构是根-干-枝-叶,无论如何组织,最终干> 枝 > 叶都是要连接到根,这就比较容易理解UNIX/Linux化繁为简的系统管理思路了,所以根目录/相当于整个目录文件树的根,如图2-1所示。

图2-1 CentOS目录文件的层次组织结构

子目录是整个目录文件树形层次组织结构中的一个中间节点,是比当前目录层次低一级的目录。文件是整个目录树形层次组织结构中的一个叶子节点。例如如果/etc目录是当前目录,那么所有位于/etc下面的目录及其子目录都是当前目录的子树,如network和NetworkManager就是/etc下的子树。除非明确指定了目录路径,大多数Linux系统命令均把文件参数看作当前目录中的文件。
在文件系统中,若干文件可以组成一个目录,而若干不同的目录则可以构成一个目录的层次组织结构,而位于目录层次结构顶端的就是一个称为根目录的特殊目录。根目录包含了各种系统目录和文件,如/bin、/boot、/dev、/etc、/home、/lib、/proc、/sbin、/tmp、/usr及/var等标准目录,更多权威信息请访问Linux基金会和维基百科,地址如下:
http://refspecs.linuxfoundation.org/fhs.shtml
https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard

CentOS文件系统的设计目的就是把文件有序地组织在一起,提供一个从逻辑上组织文件的文件系统。除了文件的组织,文件安全也是文件系统的设计的要点,所以文件的访问权限是就是文件系统的一个不可或缺的关键组成部分。

2.1.2 深入CentOS文件系统

CentOS文件系统,目录和文件的组织结构是按一定逻辑功能划分,并遵循LSB的HFS标准组织在一起,这种结构有CentOS系统的助于系统的管理和维护,并且便于用户访问和使用。下面就来掌握CentOS文件系统的重要目录(不是全部),重要分级目录如下:
根目
整个文集系统的逻辑终点,用/表示。

一级目录
◆/bin:CentOS 8中,/bin目录只是/usr/bin目录的一个链接文件,包含用户高频使用的各种程序,如bash、dd、df、gzip、grep、mv和mkdir等命令等
◆/boot:包含系统引导程序GRUB及其配置文件、Linux内核文件vmlinuz和磁盘内存映像文件initrd.img等重要引导文件
◆/dev:包含了系统支持的所有设备文件,具体说来有,console表示系统控制台,lp0表示打印机,mem表示系统的物理内存,sda表示连接到主控制器上第一个磁盘,sda1和sda2等则分别表示其中的第一个和第二个磁盘分区,ttyXX表示系统的串口设备等
◆/etc:包含系统管理和维护方面的所有配置文件,如host.conf、 resolv.conf、sysctl.conf和syslog.conf等。此外,还有大量的配置文件分别位于单独的子目录中。需要注意的,定期使用Backups备份工具备份这个目录中的重要配置文件,以便需要时能够快速地恢复系统
◆/home:包含所有普通用户的家目录,每增加一个新用户,系统将会在/home目录中创建一个和用户名相同的子目录作为该用户的家目录
◆/lib:CentOS 8中,指向/usr/lib的符号链接,只要包括内核模块和各种动态链接共享库文件(扩展名为.so,类似Windows系统中的.dll文件)
◆/lib64:CentOS 8中,指向/usr/lib64的符号链接,和/usr/lib类似,只不过主要是64位的模块和动态链接库
◆/lost+found:每个文件系统分区都存在一个lost+found目录,用于存储fsck命令在检测与修复文件系统时删除的文件或目录
◆/media:包含移动存储介质(移动硬盘或U盘)的挂载点,如插入U盘,系统将会自动将U盘挂载到到此目录下的某个子目录中
◆/mnt:包含所有自定义的文件系统的挂载点,可以挂载任何文件系统,如NFS或CIFS网络文件系统
◆/opt:应用程序等附加软件的安装目录,类似Windows系统中的Program Files目录
◆/proc:虚拟文件系统,系统关闭时为空目录,系统运行时进程文件系统根目录,其中的部分文件分别对应当前正在运行的进程,可用于访问当前进程的地址空间
◆/root:超级用户root的主目录
◆/sbin:CentOS 8中,/sbin是/usr/sbin的一个符号链接,包含超级管理员的常用工具,如管理和维护,系统引导和修复命令集合
◆/srv:分担了/var目录的一些功能,保存一些网络服务所用的数据文件
◆/sys:和proc一样是虚拟目录,系统各种设备配置信息的根目录,如,block子目录中含有磁盘及磁盘分区的配置信息
◆/tmp:临时文件目录,用于存储系统运行过程中生成的临时文件,也可以供用户存储自己的临时文件,需要注意的是,只有文件的创建者才能删除相应文件
◆/usr:此目录既可以作为根目录下的一个子目录,其中保存系统提供的各种共享数据(如用户命令、库函数、头文件和文档等),又可以作为一个单独的文件系统,可以认为是对根目录的一个递归目录,使得文件系统具有更大的灵活性。
◆/var:该目录和/usr目录类似,首先是根目录下的一个子目录,也可作为一个单独的文件系统,用于存储各种可变长的数据文件(如日志文件)、暂存文件或待处理的临时文件等

重要的二级目录
◆/boot/grub2
其中存有GRUB配置文件,以及3种不同类型的初始引导程序等

◆/etc/yum.repos.d
其中包含软件仓库配置文件,定义软件仓库的地址,描述等repo文件

◆/etc/cron.d
用于存储cron进程调度运行后台进程所用的配置和控制文件。其他有关的目录包括cron.hourly、cron.daily、cron.weekly和cron.monthly4个目录

◆/etc/sysconfig
用于保存系统中的各类重要配置文件,尤其是网络相关的配置文件

◆/usr/bin
其中包含用户经常使用的各种命令,符号链接/bin目录指向真正的/usr/bin目录

◆/usr/include
用于存储各种C语言头文件。这个目录及其子目录中的头文件是C开发人员需要经常引用的文件。其中,sys、linux和bits等子目录中定义的数据结构,对于深入学习、理解和掌握Linux系统具有极大的参考价值

◆/usr/lib
根目录下lib实际指向的目录,其中包含各种共享的库函数,可供程序员以静态或动态方式链接自己开发的应用程序

◆/usr/lib64
根目录下/lib64实际指向的目录,其中包含各种共享的库函数,可供程序员以静态或动态方式链接自己开发的应用程序

◆/usr/sbin
其中包含系统引导完成之后系统管理员经常使用的各种系统管理和维护命令

◆/usr/share
共享目录,其中含有man(联机文档的根目录)、info(GNU info文档的根目录)、doc(各种软件包特定的文档)、locale(语言环境)、vim(用户指南)及zoneinfo(时区定义)等子目录

◆/usr/src
用于存放Linux系统内核的源代码和文档等

◆/var/lib
保存软件包特定的动态链接共享库、配置文件、数据文件和状态信息等

◆/var/log
系统守护进程日志文件的存储目录,其中包括lastlog(每个用户最后一次注册的时间记录)、messages(由rsyslogd记录的所有内核和系统程序的日志消息)以及wtmp(所有用户的系统注册/注销记录)等重要文件。位于/var/log目录中的文件会不断地增长,因而要求定期地备份或清除。通常,Linux系统均采用以日、周或月为时间周期,定时执行例行检查,以循环截取(如使用/usr/sbin/logrotate一类的程序)的方式,删除过时的数据,保留一定时间范围的最新数据,使文件的大小保持一个适中的规模。在RHEL Linux系统中,每日将会定时执行一次logrotate程序,检查并处理系统日志文件

◆/var/lock
用于保存各种服务进程或应用程序访问特定的设备或文件时设置的封锁文件

◆/var/run
系统运行信息文件的根目录,其中的各种.pid文件存有相应守护过程的PID,另外一个最典型的文件是/var/run/utmp,其中含有当前系统中的用户注册信息

◆/var/spool
用于缓存各种等待处理的文件,如打印任务等。通常,每一类待处理的缓存文件均位于各自的子目录中,如/var/spool/cups等

◆/var/tmp
用于保存各种临时文件

2.1.3 绝对路径和相对路径

文件系统是个层级系统,所以要访问层级系统就有两个起点:一是总是从根目录开始算起,称之为绝对路径,特点是路径名以斜线开始,二是就从当前目录开始算起,称之为相对路径特点是以目录名而非斜线开始。绝对路径名指定了文件在文件系统的层级结构中从根目录开始的存储位置。而相对路径则是当前目录为起始字符的所有路径名都是相对路径名,相对路径名指定了文件在文件系统中相对于当前工作目录的存储位置。
此外,细心的读者会注意到每个目录都存在的两个特殊目录,它们就是包含以句点“.”和双句点“..”命名的两个特殊的目录文件,分别表示当前目录及其父目录。这两个特殊目录把文件系统中的各级目录有机地联结在一起。此外,还可以活学活用,可以以此类推,可以用../..表示上一级目录的上一级目录,../../..表示上一级目录的上一级目录的上一级目录。
下面几个简单的规则适用于所有的路径名。

Tip:特殊目录名称
~ 表示家目录

  • 表示切换到当前目录之前的目录

CentOS系统中,文件是由一系列连续的字节流组成的,最后以一个EOF字符结束。但从物理实现来讲,文件实际上是由磁盘(或其他存储介质)上的一系列数据块组成的,且组成文件的数据块,并不一定是连续的。如果文件是一个ELF的可执行文件,且具有执行权限,它执行后就会出现在内存中,已进程的形式在内存中运作。

CentOS系统并不像Windows系统那样,以扩展名区分文件的类型。因此,单从文件名本身来看,大部分文件都无从知道其类型。CentOS系统虽然没有对文件的命名规则,但却有约定俗成的命名习惯,如以“.c”作为C源程序文件名的后缀,以“.sh”作为Shell脚本文件名的后缀。

CentOS文件系统中存在多种类型的文件,如最流行的Ext3/Ext4文件系统,一般都支持普通文件、目录文件、特殊文件、链接文件、符号链接文件这五种不同类型的常规文件(管道文件和套接字文件不在本章讨论之列):

◆普通文件
普通文件是一组信息的基本存储单位。通常,每个文件都拥有一个名字,通过名字,可以对文件的数据内容进行处理。在Ext3/Ext4等文件系统中,文件名可以长达255个字符。普通文件以-表示。
普通文件可以保存任何数据,内容可以是ASCII文本、源代码、Shell脚本及各种文档等,也可以是二进制程序代码。

◆目录文件
CentOS系统中,目录也是一种文件,而且是一种特殊类型的文件,其中存储的是一系列文件名及其信息节点号。除了存储的内容不同之外,目录用于提供文件名、信息节点与文件数据之间的关联关系。
实际上,目录文件是由一系列目录项组成的,而每个目录项又主要由两个不同的字段组成:一个字段为信息节点号,用于引用信息节点,另一个字段为文件的名字。

◆链接文件
链接文件类似Windows系统的快捷方式,即把同一数据或程序赋予不同的文件名,这种类型的文件在CentOS中称作链接文件,链接文件有分为硬链接文件和软链接文件两大类。硬链接实质是不增加存储空间并不占用新的inode的复制,不能跨越文件系统,而软链接能够跨越不同的物理文件系统建立链接文件,链接文件用字母l表示。

◆设备文件
设备文件可能是最特殊的文件之一,令初学者难以理解,其实只把它当成一个可打开,读写的文件就好,设备文件的发明令用户能够像读写普通文件一样访问外部设备,而不必涉及各种I/O设备的具体操作细节,每个设备文件均对应一个I/O设备,由I/O设备驱动程序实现用户与设备之间的数据通信。常用到的设备文件类型有字符特殊文件,用字母c表示,块特殊文件,用字母b表示。

这么多文件类型,如何确定文件的类型呢,CentOS提供了file命令,改命令的使用方法请参考附增:CentOS 8高频分类命令库中的相关内容,这里只来看一下该命令执行结果:

file /bin/*
/bin/bash:                           ELF 64-bit LSB executable, x86-64, version 
1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[s
ha1]=76f84d606b53a358a1d9bffe3a383075d1b5d7ca, stripped
/bin/bunzip2:                        ELF 64-bit LSB executable, x86-64, version 
1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[s
ha1]=8b76288229151c5dc5d9a2625555234e066bc5af, stripped
/bin/busybox:                        ELF 64-bit LSB executable, x86-64, version 
1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=f959f90319
4038efe397e3dbf0cd60961a40c7a5, stripped
/bin/bzcat:                          ELF 64-bit LSB executable, x86-64, version 
1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[s
ha1]=8b76288229151c5dc5d9a2625555234e066bc5af, stripped
/bin/bzcmp:                          symbolic link to `bzdiff'
/bin/bzdiff:                         POSIX shell script, ASCII text executable
/bin/bzegrep:                        symbolic link to `bzgrep'
/bin/bzexe:                          POSIX shell script, ASCII text executable
/bin/bzfgrep:                        symbolic link to `bzgrep'

2.2 通过Shell进入CentOS命令行世界

成功部署CentOS 8之后,通过root用户登录到了黑乎乎的令行行环境,即Shell环境,这个环境只认命令,故要驾驭好CentOS就一定要掌握命令行,绝大多数Linux命令都是在bash shell中运行,笼统说来,命令是系统函数及调用的集合,可以高效地实现一个特定的功能,而将这些Linux命令按照一定逻辑(顺序,分支和循环)组织起来,实现特定的功能,Linux命令就变成了shell脚本(shell script),在生产环境,命令行和shell script是最为常用的Linux管理工具及最基本的自动化运维的工具,bash shell的特点就是简单,直接和高效。需要提醒大家的是,shell script的功能其实就是一个个Linux命令的集合,故学好高频命令及其常用参数是学习shell script编程的前提和基础。要学好Linux命令,首先要搞清楚内部命令和外部命令这两个概念,下面就是二者的区别。
◆内部命令
内部命令就是bash shell本身提供的命令,如cd,echo等命令,想知道内部命令有多少,直接在Ubuntu server中运行如下命令即可:
help

这就可以看到全部的内部命令了。

◆外部命令
外部命令则是不由bash本身提供的命令,这些命令只是需要bash shell作为其运行环境而已矣,或打个形象的比喻,bash shell犹如一个外部命令运行的容器,Linux命令的绝大多数都是外部命令。

外部命令行对于初学者来说可能比较头痛,因为命令个数和参数数量都很大,对于服务器而言,命令行又是解决问题唯一工具,因为Linux命令行对于职业的Linux系统管理员(System Administrator),系统工程师(System Engineer),云工程师(Cloud Engineer),运维(Ops)及DevOps等从业人员来说最为重要,所以对于Linux命令行的学习,首先不要急于求成,想要一口吃个胖子,其次也无需着急,因为掌握那么多的命令是一个费时耗力的过程,需要坚持和持续努力,只要方法正确,坚持使用,掌握命令行那时水到渠成的问题。

2.2.1 管理CentOS文件系统

对于典型CentOS用户而言,大多是很少使用图形界面点来点去,多数时候是面对终端敲来敲去的,对命令行的熟练程度作为衡量Linux技术水平的重要标准之一,要想熟悉命令行先来了解一下Linux命令行的一般格式:
Command Options Objects #很好记忆的Linux命令通用格式

为了便于记忆,此处采用了一个比较奇特非主流的翻译,以凑成COO(首席运营官)来表示Linux命令的格式,其中C表示Linux命令,Options表示命令选项,最后的Objects表示多操作的文件,需要注意的是Options和Objects都是复数,表示一个命令可以具有多个参数和多个操作对象。
具体说来,比如说下面的命令:
ls -lF /

其中Command是ls,Options参数有两个是l和F,分别表示长格式和根据文件类型显示不同颜色,Objects操作对象是根目录/。
tar -Jxf linux-5.2.tar.xz

其中Command是tar,Options参数有三个是J,x和f,分别表示解压xz格式tar包,x表示解压解包和f表示所操作的文件名称,后面只能接文件名,Objects操作对象是内核源代码linux-5.2.tar.xz。

使用命令行要特别注意当前用户的权限,安装系统后登录CentOS的用户即可以是超级用户root,也可以是普通用户,对于超级用户,对于整个系统用于绝对的控制权,而对于普通用户而言,在自己的家目录,就是/home目录下和用户名同名的目录,具有完全的权限,而除此之外的地方主要是超级用户root的地盘,所以权限受限,上述操作在自己的家目录之外,就需要sudo命令。sudo命令的基本功能就是临时把你变成超级用户,默认是五分钟,在这期间可以临时变身为超级用户,修改系统文件的权限。之后章节会有很多地方要用到sudo命令,要临时变身成超级用户只需在执行的命令前添加sudo,执行后会提示输入当前用户密码,通过身份验证后就变成五分钟超级用户,这样做的主要目的是为了安全,因为sudo命令在赋予你临时超级用户身份的同时也会记录下你的身份,这样既方便了普通用户的操作,又减少超级用户密码的使用。

cp -r ./src /
cp: cannot create directory ‘/src’: Permission denied

直接复制报错,提示没有权限将src目录复制到根目录,添加sudo命令变身为五分钟超级用户,使得上述操作顺利完成:

sudo cp -r ./src /
[sudo] password for henry: 

将当前目录的src目录复制到根目录,由于当前用户对根目录没有权限,所以使用sudo命令。此外,如果没有超级用户的授权,普通用户是无法使用sudo命令的,至于授权可以使用visudo命令实现,用法可见附录中的visudo命令。最后提醒大家的是,笔者使用普通用户henry登录系统,然后为了演示和操作方便,使用如下命令变身为超级用户:

sudo -i

掌握了Linux的通用格式后,就大胆模仿使用,要运行Linux命令行,可以先使用快捷键“Ctrl+Alt+
1-6”来切换到Linux的终端模式,首先用自己的用户名和密码登录后才可以运行个命令,如果要返回图形界面则使用快捷键“Ctrl+Alt+
7”来切换,由于命令行表示安装及配置即十分简洁又准确无误,所以来本书后续的章节的操作将主要以命令行为主并辅以图形界面的方式帮助大家将命令行使用起来,边学边用方能扎扎实实地掌握。此外,为了初学者便于理解,多数命令行都会有相关注释以便于大家理解和操作。

所有关于命令的讲解都分门别类地放到附录中,通过附录中的命令实例来掌握CentOS的命令行。

2.2 命令行分身有术的Tumux

本章的标题是通过Shell进入CentOS命令行世界命令行,其实用户是通过虚拟终端程序的才能触碰到Shell,那什么是终端呢?终端就是计算机发展的早期的一种设备,那是计算机硬件昂贵,所以当时大多采用一台计算机主机配以多台终端机来共享计算机的资源,终端本质上就是一台显示器,将计算机的运算结果返回给用户。现在个人计算机硬件已经十分便宜了,终端也退出了历史舞台,不过,在UNIX和Linux还使用终端这一概念,只不过以虚拟终端的形式提供给用户,所谓虚拟终端就是通过软件仿真实现的终端,大家登录到那个黑乎乎的程序,就是CentOS 8默认提供的7部终端之一,主要用来运行命令行,至此,通过终端和Shell,已经可以敲命令了,不过在CentOS环境,敲命令有一大痛点,那就是服务器的虚拟终端环境分身乏术,笔者推荐大家使用Tmux终端,帮助大家提高工作效率,令命令行终端分身有术。

Tmux是一个BSD协议发布的终端复用软件在服务器端托管及同时运行的多个会话,既可以全屏也可以半屏显示,运行效果如图2-2所示:

图2-2 Tmux终端中运行命令

安装和运行
运行如下命令安装Tmux:

dnf install tmux -y

运行如下命令运行Tmux:

tmux

Tmux可以管理和操作三种对象,分别是会话(Session),窗口(Window)和子窗口(Pane),这三个对象大致关系是,一个会话可以包括一个或多个窗口,而一个窗口则可分为一个或多个子窗口,运行如下命令退出tumux:

exit

1.Tmux会话操作
Tmux会话操作,如创建,查看,detach和attach会话等,要创建一个名为server1和server2的新会话,命令如下:

tmux new -s server1

要断开当前会话,回到默认命令行只需运行如下命令,需要注意的是,这个操作仅仅是断开和当前会话的连接,而非关闭此对话:

tmux detach

断开当前会话是为了创建另外一个会话,具体操作如下:

tmux new -s server2

再次运行如下命令断开当前会话,回到默认命令行:

tmux detach

这时就可在两个会话中进行各种操作了,需要注意的是,一个会话可能包含一个或多个窗口,使用如下命令查看当前会话:

tmux list-session
server1: 1 windows (created Thu Sep 19 09:39:38 2019) [137x37]
server2: 1 windows (created Thu Sep 19 09:40:13 2019) [137x37]

或:

tmux ls                                     #命令的简写方式,推荐使用

需要时重新连接server2会话,只需运行如下命令:

tmux attach-session -t server2

或:

tmux a -t server2                           #命令的简写方式,推荐使用

最后,要关闭某个或所有session,使用如下命令:
tmux kill-session -t server1                #关闭server1会话

或:
tmux kill-server                            #关闭当前所有会话

需要注意的是,关闭session和断开session是不同的,需要谨慎使用,至此,Tmux会话的高频操作掌握这些就够用了。

2.Tmux窗口操作
掌握了高频Tmux会话操作之后,再来看看Tmux窗口操作,要在一个会话中创建多个窗口或进行各种窗口操作,可使用快捷键Ctrl+B和各种窗口命令,高频窗口操作如下:
Ctrl+B > c #先按下组合键Ctrl+B,松开后再按c键,下面操作类似

高频窗口命令如下:
w:列出所有窗口,可直接通过上下键选择窗口
f:查找窗口
n:后一个窗口
p:前一个窗口
&:关闭当前窗口

除非必要不推荐创建多个窗口,建议使用多会话单窗口和分屏操作,因为引入窗口使得管理和使用变得过于复杂。

3.Tmux子窗口操作
Tmux子窗口又称窗格,英文为Pane,一个会话可能包含一个或多个窗口(Window),而一个窗口又可以分为多个子窗口(Pane),可使用快捷键Ctrl+B及子窗口命令,高频子窗口命令如下:
◆上下分屏
Ctrl+B > " #先按下组合键Ctrl+B,松开后再按双引号键

◆左右分屏
Ctrl+B > %

◆子窗口间切换
Ctrl+B > o

◆退出子窗口
exit

Tmux的操作还很多,这里只是抛砖引玉,仅仅介绍了高频命令及操作,感兴趣的朋友可以查阅其manpage或如下网址:
https://tmuxcheatsheet.com/

2.3 最简单小巧的文本编辑器nano

使用CentOS,少不了和文本编辑器打交道,nano可以说是最简单的文本编辑器,同时也是服务器管理者重要的工具,用于编辑各种配置文件,由于是在命令行模式,故编辑器也只能使用文本方式的编辑器,最便捷的莫过于nano,默认安装,接近于零的学习成本。

文本编辑器nano的全名为GNU nano,是一个极为简单的所见即所得文本界面编辑器,比Unix下著名的Pico编辑器功能更强,如支持语法高亮,正则表达式搜索和替换等,如果在CentOS终端中输入pico命令,将会直接打开nano。此外,掌握nano只需要熟悉文本界面和高频组合键之外几乎不用特别学习。

首先需要掌握nano打开文件的技巧,掌握后可以打开文件后直接将光标定位到某行某列,提高效率,具体方法如下:

nano +6,1 /etc/fstab

这样使用编辑器打开/etc/fstab文件后,直接定位到该文件的第六行,直接添加所需内容即可,十分方便,具体操作如图2-3所示。

图2-3 最简单的所见即所得编辑器nano

由于nano是所见即所得的文本编辑器,只需移动上下左右键即可移动光标,只需按住Shift键,再移动上下左右键便可选取文字,如果支持鼠标,则可用鼠标直接选取,十分直观和简单,用过文本编辑器的朋友能很快上手。需要强调的是nano的-w参数,此参数可以防止nano自动换行而存乱配置文件。

nano高频组合键

◆撤销和重做
使用Alt+U撤销上一次的操作,而使用Alt+E重做上一次的操作。

◆搜索关键字
按下Ctrl+w组合键,然后输入搜索的关键字,回车将会定位到第一个匹配的文本,如继续查找下一个可以用Alt+w组合键来定位到下一个匹配的文本。

◆翻页操作
文件难免很长,可以使用组合键Ctrl+y翻到上一页,还可使用组合键Ctrl+v翻到下一页,如通过nano浏览syslog文件:

nano /var/log/syslog

便可使用上述组合键进行翻页。

◆复制文本
无论是用组合键还是鼠标,选中文字后,都可以使用Alt+6组合键进行复制。

◆剪切文本
无论是用组合键还是鼠标,选中文字后,都可以使用Ctrl+k组合键进行剪切

◆粘贴文本
无论是复制还是剪切,都需要定位好光标后,使用Ctrl+u组合键进行粘贴。

◆保存修改
使用Ctrl+o组合键保存对文件的变更。

◆退出
使用Ctrl +x组合键退出,如果修改了文件,将会询问是否保存修改,通常输入y保存,输入n则不保存,如输入了y,还要输入所保存的文件名,不需要修改文件名直接回车即可,若保存为其他名称可直接命名,和notepad的另存为十分类似。

Tips:看懂nano的提示
在nano下部的使用提示中,Ctrl键被表示为^,因此Ctrl+W被写成了^W,Alt键则被表示为一个M,因此Alt+U被写成了M-U,此外,需要注意的是组合键的字母,大小写其实均可,不过使用小写情况多一些,比较便捷得多。

2.4 更为专业的编辑器vim

CentOS默认为大家提供了vi编辑器,推荐大家使用其增强版本vim。vim编辑器几乎无所不能和无处不在,多数UNIX或Linux系统默认就有vi编辑器而无需安装,可直接打开开始编码。

◆安装vim编辑器
CentOS环境中可输入如下命令进行安装:

dnf install -y vim

在命令行中执行如下命令就可以看到vim界面:

vim 

vim的默认界面如图2-4所示。

图2-4 vim默认界面

◆打开文件
从其默认界面可以了解到vim的版本信息,也可以直接使用vim打开一个文件进行浏览或编辑,具体操作如下:

vim /etc/passwd

如果知道要编辑文件的行数,比如说/etc/passwd文件的第18行,就可以使用vim精确定位所打开文件,文件开启,光标会自动定位到所制定的行,运行如下命令实现:

vim +18 /etc/passwd

◆一次打开多个文件
默认情况,一次只能打开一个文件,如何让vim一次性打开多个文件呢?需要使用一个参数就可以实现,具体操作如下:

vim -O /etc/passwd /etc/group

这样,vim一次性可以打开/etc/passwd和/etc/group这两个文件,光标默认在最左边的窗口中,可以直接编辑该窗口中的内容,如果要编辑另外一个窗口的内容,使用Ctrl+w组合键切换到另外一个窗口。如果需要打开更多的文件,只需将多个文件名之间用空格隔开即可,如要一次性开启三个文件,可以运行如下命令:

vim -O /etc/network/interfaces /etc/resolv.conf /etc/hostname

实际效果如图2-5所示。

图2-5 vim一次性打开三个窗口

◆配置vim令开发起来更顺手
对于使用vim作为自己主要编辑器的开发者,需要设置vim以满足起码的开发要求,如显示行号,自动缩进,语法高亮等功能。具体方法是运行vim,直接输入冒号,并依次输入如下配置参数:
:set nu #显示行号
:set ai #自动缩进
: set ts=4 #将Tab键的值设置为4个空格,默认为kernel风格的8空格
:syntax on #语法高亮显示

vim编辑器就配置好的效果如图2-6所示。需要注意的是,语法高亮功能实现的前提是保存为文件且文件的扩展名清晰明了,如打开一个用C语言开发的程序,这时才会有语法高亮显示。

图2-6 配置好的vim

当然这些参数也可以使用在文本界面的vim中,这三个参数可以保存在vim配置文件中,这样就不用每次配这几个参数了,vim配置文件具体位置为/etc/vim/vimrc,只要将这三个设置命令追加并保存在vimrc配置文件尾部即可。

◆创建和编辑文档
要创建文件只需在vim命令后跟上文件名称即可,编辑文档对于新手来说比较困难,因为虽然vim是一个所见即所得编辑器,但其还保留了很多比较原始的编辑器的使用习惯,称之为需要命令控制的所见即所得编辑器也许更合适,而这些习惯对于初学者来说可能会感觉比较怪异,所以十分需要逐步适应和学习。首先要适应和学习的是要牢记vim的三个主要模式(还有很多其他模式,编辑文件主要用到这三个),命令模式,编辑模式和EX模式(又称之为底行命令模式)。vim处于命令模式时,从键盘接受的输入全部会当成vim的控制命令而不会是文本,当使用a/i/o任何一个命令切换到vim的编辑模式时,这时vim才像一个所见即所的编辑器,切换到该模式即可以开始编辑文件内容,输入代码,配置或文本后,要退出vim,需要使用Esc键切换到命令模式输入ZZ(保存退出)/ZQ(不保存退出)或输入冒号进入EX模式输入q命令退出或wq命令保存退出。比较高效的办法是绕开EX模式,直接在命令模式和编辑模式切换,而且将常用的命令和快捷键烂熟于心,真正的vim程序员的手一般是不会离开主键盘区域而可以完成所有工作。要想了解一个程序员使用什么编辑器,只需检查键盘,如果Esc键上文字模糊不清或锃光瓦亮,基本可以认为这是一个使用vim的程序员。更多的操作参阅下面即将介绍的vim的中文手册,内容丰富翔实。

◆vim中执行命令
很多时候需要在vim的编辑过程中执行Linux命令,这时可以先用Esc键切换到命令模式,然后输入冒号进入Ex模式,并输入如下格式执行Linux命令:

:! gcc -o hello hello.c

运行上述命令后,vim会消失不见,犹如在命令行执行命令一样,虽然看不到vim,感觉到了命令行环境,但要明白,这还是在vim环境中,如果要退出命令后,需要运行按下回车键返回。

◆定义快捷键
vim强大的一个重要原因,可以自定义各种快捷键,用起来更加高效。下面就将前面的设置定义为快捷键以方便使用,具体定义方式如下:

vim /etc/vim/vimrc
noremap <F6> :set nu
noremap <F7> :set ai
noremap <F8> :set syntax on

此外,定义vim快捷键的方法和命令很多,这里只是将上述配置定义为快捷键,这样按下上述定义的快捷键,vim底部就会出现所对应的设置,直接按回车就马上生效。
◆高效配置
vim的高效设置会使vim操作起来更加高效,接下来就是一些常用的高效设置。

filetype on         #启用文件类型侦测
set encoding=cp936  #指定当前字符编码为Windows简体中文
set tabstop=4   #设置TAB键为四个空格,这个配置对于Pythone程序员来说最为实用
set mouse=a     #在终端中使用鼠标
set ignorecase  #查找时忽略大小写

2.5 Shell可用资源管理命令ulimit

前面介绍了Shell,虚拟终端以及文本编辑器,却忽略了一个Shell环境的重要工具ulimit这个Shell资源的大管家,ulimit命令主要是用来限制进程对资源的使用情况的,支持各种类型的限制,如内核文件的大小,进程创建文件的大小,打开文件描述符的数量、,单用户的最大线程数等,在介绍ulimit的具体用法之前,先来掌握如何获得当前系统所有的limit资源信息,具体方法如下:

ulimit -a

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31117
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 31117
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Tips:ulimit的两种限制,软限制和硬限制:
◆软限制:任何进程都可以修改软限制,唯一需要注意的是软限制不能超过硬限制
◆硬限制:普通进程可以降低硬限制,只有root进程可以提高硬限制;

ulimit的高频用法:
ulimit -a:查看当前Shell资源的限制(软限)
ulimit -Ha:查看当前Shell资源的硬限
ulimit -n:显示当前可打开的文件描述符数量(软限)
ulimit -Hn:显示当前可打开的文件描述符数量,硬限制
ulimit -HSn 10240:设置可打开的文件描述符数为 10240(软限+ 硬限)
ulimit -u:获取系统最大进程(线程)数(软限)
ulimit -Hu:获取系统最大进程(线程)数(硬限)
ulimit -u 10240:设置系统最大进程数(软限)

ulimit命令用得最多的可能是修改打开文件描述符的数量和用户最大可用的进程数,有两种方式可以实现改变,即临时生效和永久生效,下面就以取消最大文件打开数及进程(线程)数量的限制,增大10倍数量为例来介绍这两种方式。
◆临时生效
ulimit命令所登录Shell会话期间有效,具体操作如下:

ulimit -n               #获取当前可打开文件描述符数量
1024

ulimit -n 10240         #设置为当前值的10倍

ulimit -n               #再次查看,数量已变
10240

同理可运行如下命令修改进程数量:
ulimit -u 10240

reboot一下,再次运行上述命令:
ulimit -n
1024

又变回了原来的值了,真是临时生效呀。

◆永久生效
如不想重启后改好的数值消失不见,需要修改ulimit的配置文件/etc/security/limits.conf:

vi /etc/security/limits.conf

添加如下的配置:

* soft nofile 10240         #软限,可将*替换为具体某个用户
* hard nofile 10240         #硬限

上述配置中,*代表所有用户,soft表示软限,hard表示硬限,nofile是代表最大文件打开数,noproc代表最大进程数。

上边两行配置可以用2行替代:

  * - nofile 10240

需要注意的是,-的意思为软和限全部限制。除此之外,还需要修改/etc/systemd/system.conf文件中相应的值,保存退出后,重启系统生效,登录再看看限制:

ulimit -n
10240

数量直接扩大了10倍。如需修改进程数,需要运行如下命令:

vim /etc/security/limits.d/90-nproc.conf

*          soft    nproc     1024                   #普通用户为1024
root       soft    nproc     10240                  #root用户可以修改为10240

保存退出后,重启系统生效,登录再看看限制:

ulimit -u
10240

结合实际,以著名的NoSQL MongoDB为例,频繁访问MongoDB时,如Shell的最大进程数设置过低,会产生无法连接MongoDB的错误,为了避免该错误,就需要执行如下命令修改默认的开启文件的数量:

ulimit -n 10240     #修改当前Shell所能启用的最大文件数

如要永久生效则需修改/etc/security/limits.conf文件。此外,将类似于ulimit -n 10240及ulimit -u 10240命令保存到/etc/profile也可以令这些配置永久生效。

Tips:如何查询某个进程的限制?
可以使用如下命令格式查看指定进程的系统限制,格式如下:
cat /proc/PID/limits命令

如查看1号进程的系统限制,可以用如下命令:

cat /proc/1/limits
Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             31117                31117                processes
Max open files            65536                65536                files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       31117                31117                signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

关于Shell资源的配置,后面的章节还会涉及,如配置ELK stack的Shell资源分配等。

本章小结
本章首先深入了CentOS的独特的文件系统,无处不在的文件,着重比较了CentOS和Windows文件及文件系统的差异,并教大家掌握图形界面文件管理器的操作方法,随后循序渐进地开始命令行操作之旅,刚开始比较简单,教会大家在命令行进行各种操作,进而学习稍微复杂一点的tumix和基于命令行的文本编辑器nano/vi/vim,最后介绍了Shell的资源管理工具ulimit命令的使用。需要提醒大家的是,从这章起就以命令行操作为主导,辅以图形界面操作,后面章节的命令行会逐步增加难度。

EOF

扩展阅读
Filesystem Hierarchy Standard
http://www.pathname.com/fhs/

Filesystem Hierarchy Standard(2.3)
http://www.pathname.com/fhs/pub/fhs-2.3.pdf

Setting limits with ulimit
https://www.networkworld.com/article/2693414/setting-limits-with-ulimit.html

参考文档
https://wiki.linuxfoundation.org/en/FHS
http://www.pathname.com/fhs/pub/fhs-2.3.html
https://www.nano-editor.org/
https://www.vim.org/
http://tukaani.org/xz/
http://linuxcommand.org/
http://www.openssh.com/manual.html
http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html
http://www.binarytides.com/better-fedora-23/