1 Linux的发行版
1.1 为什么会有发行版?
虽然Linux的内核是开源的,但是它是源码开源。普通的用户很难有能力能够把源代码编译成功、并组织起相关的开源程序,启动为一个完整操作系统的能力,所以一些社区、公司、机构就会按照他们对操作系统、使用习惯等一系列的理解,把源代码编译好、附加上一些包管理器和一些常用包,并作出一些个性化的修改,最后配上一个简单的安装程序来帮助我们部署,这样打包好的Linux操作系统我们就称之为Linux发行版。
Linux内核的访问链接
https://www.kernel.org/
1.2 目前主流的Linux发行版分支:
1.2.1 下面对一些用户基数大的发行版进行一些总结:
Ubuntu:是一个桌面应用为主的发行版,它的后面有个更加以桌面化美观的分支版本Mint。
Slackware:S.u.S.E是一个注重于安全领域的发行版分支。有服务器发行版的SLES和桌面发行版的openSUSE。
Redhat:有自己的服务器版本RHEL、桌面版本的Fedora和几乎和Redhat相同的社区维护的CentOS。
这里解释一下Redhat和CentOS关系:
CentOS在2003年底推出,CentOS是一个重新编译可安装的Red Hat Enterprise Linux(RHEL)代码,并提供及时的安全更新的所有套装软件升级为目标的社区项目。更直接地说,CentOS是RHEL克隆版而已。两个发行版技术间唯一的区别是品牌 – CentOS替换所有红帽的商标和标识为他自己的。
Arch Linux:系统设计以 KISS原则(保持简单和愚蠢)为总体指导原则,注重代码正确、优雅和极简主义,期待用户愿意去理解系统的运作。
Gentoo Linux:为用户提供了大量的应用程序源代码。Gentoo Linux的每一部分都可以在最终用户的系统上重新编译建造。
1.3 Linux发行版的安装
**说明:**这里我们通过两个发行版来举例:一个是Centos7.9、一个是Ubuntu1804。
1.3.1 CentOS安装篇
1.3.1.1 环境介绍
首先说一下我们准备的测试环境,采用虚拟机的方式做这个演示,相关的版本、系统镜像如下:
1.3.1.2 新建虚拟机
1.3.1.2.1 选自定义
1.3.1.2.2 选稍后安装操作系统
1.3.1.2.3 选择安装那种操作系统
**注意:**这里我这个版本的vm中Linux下的CentOS只能32位、64位这两个,我们选择64位的。
1.3.1.2.4 命名虚拟机的名称
尽量有一定的命令规律,我这里的规则是(发行版+系统版本号+具体节点号或者功能)。然后所在的文件系统目录最好跟名字能对应上,方便以后查找。
1.3.1.2.5 处理器配置
这个是只是做安装演示的,所以配置给的比较低,根据自己的电脑需求来进行适当调整即可。
**注意:**核心数量不可以超过物理机实际数量,否则会报错。
1.3.1.2.6 虚拟机内存分配
虚拟机分配的内存,这里也是演示使用所以只给了1G也就是1024MB。不过需要注意一点,如果要图形化安装,内存至少给够768MB,否则可能图形安装界面无法启动会报错或者安装完成后无法进入系统。如果机器内存实在是紧张,又不会命令行环境下安装就可以先配置1G内存安装好系统,后续调整运行级别后再把虚拟机的内存分配降低。
1.3.1.2.7 网络选择
这里因为我是公司内部网络,ip地址需要绑定认证才能正常访问外网,所以选择NAT模式,这里选择NAT和桥接都可以。根据自己的实际网络环境安排即可。
1.3.1.2.8 指定磁盘容量
磁盘的容量分配上,我选择20G,磁盘容量充足的可以调大一点(比如 40G),后续就不会有做着做着实验磁盘空间不足的问题。
这里有两点我们要注意的:
- 为了防止磁盘空间在分配时立即被占用造成空间浪费,我们不要选择立即分配所有磁盘空间这个选项。
- Windows有些老机器的文件系统还是FAT32,它不支持最大单个文件超过4G的,所以建议使用拆分多个文件这个选项。(当然现在大部分我们都已经用的是NTFS)
1.3.1.2.9 新建虚拟机总览
虚拟机的创建的最后会给我们一个总览,我们可以检查一下是否跟我们想要的设置参数相同,如果硬件不能满足要求可以再自定义中添加,比如:多加一块网卡等。
- 在总览这里,我们点击自定义硬件,把我们的ISO镜像配置到光驱上。
到这里我们虚拟机的创建配置过程就完成了。下面是真正操作系统的安装操作部分。
1.3.1.3 操作系统安装配置
1.3.1.3.1 接通虚拟机电源
- 默认创建好的虚拟机是没有打开的。
- 如果顺利我们会进入安装的界面
解释一个这三个选项吧:
- 安装CentOS 7
- 测试光盘,同时进入CentOS 7的安装
- 故障排除
**提示:**如果是第一次下载下来未使用的镜像文件,建议先做个检查再安装,选择第二项,如果已经安装过很多次了。就直接选第一项,我们这里以第二项为演示。
**注意:**白色部分才是你选择的选项,选择并回车。
这里我们看到界面的打印,已经开始再检查了。可以按Esc跳过。后续检查完就会自动进入安装界面了
1.3.1.3.2 选择安装过程中的语言、键盘布局
我们都选英语的就好了
然后我们就正式进入配置操作系统安装的部分了,这里提示我们需要把带有三角感叹号的选项都配置好后才能进行下一步。
1.3.1.3.3 操作系统安装相关配置
1.3.1.3.3.1 时区
- 点击进入时区和时间的配置选项中
- 在世界地图上选择中国地域的部分,就可以切换到亚洲上海的时区了,然后点击左上角退回配置主菜单
1.3.1.3.3.2 软件包安装
- 默认是最小化安装的,也就是正常启动系统需要的包会被安装以外,其他的都是没有的。这样对新手不太友好,我们需要点进去配置一下加个桌面环境。
- 我们选择GNOME Desktop这个桌面环境的,然后继续点击左上角退回主配置界面。
1.3.1.3.3.3 分区
- 点击这里我们进入系统磁盘分区的配置界面
**注意:**其实我们进来这个配置界面,再点击左上角返回也能够完成磁盘的配置,但是那是系统自动分配的LVM的,我们就不用这个自动的配置了。
- 选择左下角的,自己分配磁盘分区,然后点击左上角进入分配界面
- 这里进来我们看到我们是LVM的,我们点LVM这里,进去选择,标准磁盘分区
- 现在调整为标准磁盘分区了。我们就点击左下角的加号来添加想要的磁盘分区类型。这里我们一共分配三个。
- 启动分区,分配500M的磁盘空间和选择挂载点/boot
启动分区这里我们注意,配置完出来是xfs格式的,文件系统格式我们选择一下ext4
-
swap分区
这里的大小我们通常设置为所配置的虚拟机内存的1.5倍,如果结果超过8G,那就设置8G就好了。我这里是1G内存的机器,所以设置了1.5G的swap分区大小
-
根分区
剩下的容量我们不配置了(注意留空),都分配给根分区即可。
- 最后我们检查一下,我们配置的三个分区是否争取。如果没问题,我们就点击左边退出分区配置
-
退出时候,会问我们是否同意磁盘的分区更改,我们点击同意。
**注意:**这里演示的是空的新磁盘状态,如果是物理机等磁盘中有数据的,请提前做好数据备份,这个同意按钮会清空格式化磁盘数据。
1.3.1.3.3.4 内存转存
这个功能不太需要我们关闭一下,点击进入。
把这个勾选的内容去掉,退出即可。
1.3.1.3.3.5 网络配置
- 配置域名和IP,我这里是NAT的所以IP是DHCP自动获取的,只要打开网络开关就行。
配置到这里就差不多了,我们也看到右下角的图标本来是灰色的,现在亮了,我们点击继续下面的步骤。
1.3.1.3.4 设置用户和密码
进入这个界面我们发现又有三角感叹号图标了。一想就知道需要继续配置了。
1.3.1.3.4.1 配置root的密码
- 这里我们设置一个简单的密码,毕竟是做实验用的。
**注意:**我们设置完密码就点击左上角退出,可能点一次会发现没反应,这里我们需要再点一次,因为我们的密码太简单了。所以需要我们确认是否使用这个密码。
1.3.1.3.4.2 创建一个普通用户
这个用户作为后续登陆的用户。root权限太大尽量还是不要登陆了。我们选择右边这个,创建一个用户。这里我们可以看到安装程序已经在安装包了左下角可以看到具体的进度。
- 进入配置界面,基本跟root的配置一样,不过我们可以考虑把这个账号,添加sudo管理员身份的权限。密码太简单的记得多点一次退出。
1.3.1.3.5 操作系统配置完成
我们等待下面的进度条跑完出现重启按钮即可。
1.3.1.4 安装重启后的配置
顺利重启后,我们还是会进入一个类似安装的界面。这里我们需要完成第一步是关于同意许可证协议的。
**注意:**如果前面已经配置了普通用户,这个界面就只会有第一步和第二步。
1.3.1.4.1 同意许可证
我们进入把勾选选上即可。
然后我们退出到主配置界面会发现右下角的图标亮了。不是灰色了。我们就可以点击正式进入操作系统了
1.3.1.5 登陆操作系统
界面上我们可以看到我们配置的普通用户已经在登陆系统的列表上了。我们输入安装过程设置的密码登录系统。
1.3.1.6 登录系统后的设置
1.3.1.6.1 图像界面系统的语言选择
1.3.1.6.2 隐私询问
是否开启定位服务,我这里关闭了。根据自己的喜好选择即可。
1.3.1.6.3 选择键盘布局、输入法。这里我们选择英文即可。
1.3.1.6.5 安装结束
我们看到这个大大的对钩,就表示我们的安装过程结束了,可以开始使用操作系统了。
1.3.1.7 补充内容
- 最后这部分说一下之前为什么说图形界面最好768M内存。我们看到这是安装完成进入操作系统后内存的消耗。已经738M了。这也是为什么建议最低768M内存的原因。
- root用户如何图形界面登陆。我们看到我们选择登陆的界面只有我们设定的普通用户?那root用户如何选择?这里我们要注意看登陆的界面有个选项是如果用户没在用户列表中显示可以点击这个选项
然后我们就会进入手动输入账号名的界面,我们输入root和在对应界面输入root的密码,即可登录系统
**注意:**我们用root登陆操作系统,系统是会给我们一个友善的提示的,告诉我们这样的行为是比较危险的,应该尽量避免。
- 为了防止后续系统出问题需要重装,建议对安装完成的虚拟机做个快照。
1.3.2 Ubuntu的安装
1.3.2.1 环境介绍
这次我们使用的IOS镜像是:
1.3.2.2 新建虚拟机
这一部分跟上面centos篇类似,我们简单过一下。
1.3.2.2.1 选择自定义
1.3.2.2.2 选择稍后安装操作系统
1.3.2.2.3 选择安装那种操作系统
1.3.2.2.4 命名虚拟机的名称
尽量有一定的命令规律,我这里的规则是(发行版+系统版本号+具体节点号或者功能)。然后所在的文 件系统目录最好跟名字能对应上,方便以后查找。
1.3.2.2.5 设置处理器配置
这个是只是做安装演示的,所以配置给的比较低,根据自己的电脑需求来进行适当调整即可。
1.3.2.2.6 虚拟机内存分配
虚拟机分配的内存,这里也是演示使用所以只给了1G也就是1024MB。我们这里安装的是服务器版本,本身并没有带图形界面,如果内存资源紧张给小一点也没关系。
1.3.2.2.7 网络选择
这里因为我是公司内部网络,ip地址需要绑定认证才能正常访问外网,所以选择NAT模式,这里选择 NAT和桥接都可以。根据自己的实际网络环境安排即可。
1.3.2.2.8 指定磁盘容量
磁盘的容量分配上,我选择20G,磁盘容量充足的可以调大一点(比如 40G),后续就不会有做着做着 实验磁盘空间不足的问题。
1.3.2.2.9 新建虚拟机总览
- 在总览这里,我们点击自定义硬件,把我们的ISO镜像配置到光驱上。
到这里我们虚拟机的创建配置过程就完成了。下面是真正操作系统的安装操作部分。
1.3.2.3 操作系统安装配置
接通虚拟机电源
启动完,现在开始进入一个紫色主体的界面我们开始安装过程。
**注意:**这里不支持鼠标操作了,只能用键盘操作。
1.3.2.3.1 选择安装过程的语言
- 选英语,回车
1.3.2.3.2 正式进入安装
1.3.2.3.3 选择操作系统语言
- 选择英语
1.3.2.3.4 选择时区的
- 先选香港
1.3.2.3.5 检查键盘布局
1.3.2.3.5.1 是否自动检测键盘布局,选择No
1.3.2.3.5.2 选择键盘布局
- 选英语,默认的就好
1.3.2.3.6 配置域名
1.3.2.3.7 配置一个普通用户
1.3.2.3.7.1 配置新用户的姓
- Ubuntu默认是不能使用root进行登陆的,所以我们需要新建一个用户,这里配置新用户的姓,我为了方便直接写全了。
1.3.2.3.7.2 配置新用户的名
- 这里配置新用户的名,我上一步写完了。所以这一步不进行修改了,直接下一步。
1.3.2.3.7.3 输入新用户的密码
1.3.2.3.7.4 再次输入新用户的密码
1.3.2.3.7.5 密码复杂性检测
- 这里因为我是测试安装用途的,密码设置的比较简单,所以询问是否使用这个复杂度比较简单的密码,我们点击Yes继续。
1.3.2.3.8 时间同步
- 安装软件在跟网络时间服务器同步
1.3.2.3.8.1 时区变更提示
- 上一步同步完会询问我们,因为我们一开始选的时区不太对,定位到我们的物理时区所用的应该是Asia/Chongqing。问我们是否使用,我们用Yes继续。
1.3.2.3.9 手动分区
- 下面进入分区阶段,我们选择手动分配
- 进入磁盘分配界面,我们选择我们配置时候虚拟机时候的20G磁盘
- 进入后,询问我们是否新建空的分区表。我们选择Yes
- 现在我们就看到新的分区表下有一个空闲的空间等待我们去分区了,选择进入这个空闲的磁盘空间
1.3.2.3.9.1 创建启动分区
- 询问我们对空闲空间的操作,我们选择新建分区
- 输入想要分配的磁盘大小。我这里是想创建启动分区,所以输入了500M
- 询问我们是新建主分区还是逻辑分区,我们选Primary
- 这里询问,我们是从空闲空间的开头还是结尾开始划分新分区,我们选Beginning
- 然后进去修改一下挂载点默认是/,我们因为是启动分区,所以需要调整一下,这是最后的调整结果(主要就是进入Mount point里面选择挂载点为/boot)
- 完成上面的内容后,我们就看到我们的第一个启动分区分配完毕了。我们继续选择步骤2中空闲的空间,继续进行分区的操作
1.3.2.3.9.2 创建交换分区 SWAP
- 分配空间,我这里写1.5G。
- 上面解释过了。不继续解释了。选择Beginning
- 交换分区swap需要我们手动选择一下分区类型,默认分配完空间的分区类型是Ext4。
- swap分区的最终结果如下图
- 回到分区总界面,我们看到前面两个分配好的分区了。我们继续分配余下的给根分区即可
1.3.2.3.9.3 新建根分区
- 创建新分区
- 分配剩余所有空间
- 因为我们只是分三个分区,都选择主分区就可以了。
- 调整一下文件系统为XFS,不调整用默认的Ext4也可以。
- 最终分区结果如下,三个分区。我们对照核对一下。
1.3.2.3.9.4 确认分区配置写入
- 这里会有一个写入确认,我们因为是虚拟机,是新的空闲磁盘所以我们点击Yes,如果是物理机或者有数据的磁盘,我们记得备份数据再继续。
1.3.2.3.10 是否设置网络代理
- 这里询问我们是否需要代理,我的网络环境不需要,所以留空。继续下一步。
1.3.2.3.11 配置系统更新策略
- 这里是配置系统的升级模式的,我们为了系统稳定,通常选择不自动更新。
1.3.2.3.12 预安装包选择
-
这里选择我们想要预先安装的软件包,我们选择OpenSSH。
**注意:**是用空格选择。然后按Tab在选择Continue回车。
1.3.2.3.13 启动引导器安装
- 我们继续等待安装系统的自动安装。遇到这里询问我们是否安装GRUB的启动引导器。我们选Yes。不然后面启动不了系统
1.3.2.3.14 操作系统安装引导完成
- 等待进度条加载完成,到这个界面,我们基本上就完成安装了。然后我们选择Continue。正式第一次启动我们的Ubuntu系统。
1.3.2.4 进入全新安装的操作系统
- 如果顺利,在重启系统后就会进入用户登陆界面,我们把刚才安装过程中设置的账号密码输入就好了
看到这个界面我们就登陆成功了。
1.3.2.4.1 建议
- 我们可以把这个刚登陆的状态创建一个快照,以防系统弄坏了可以及时恢复。
2 Linux 命令历史的配置
2.1 为啥会有命令历史?
方便审计用户行为,用户具体对操作系统做了什么操作。
2.2 命令历史有什么好处?
方便用户调用重复的同一行命令或者之前执行过的命令、甚至是执行过命令的参数,从而提高我们的使用效率。
2.3 命令历史的用法:
2.3.1 介绍环境
- 演示的操作系统版本:Centos 7.9.2009
2.3.2 history命令的一些主要用法
- centos上打印、管理命令历史的命令就是history,我们下面简单说一下它的用法
2.3.2.1 打印命令历史列表
[root@centos7 ~]# history
1 ll
2 history
2.3.2.2 打印最近的第N条命令
[root@centos7 ~]# history 10
11 history -p
12 echo $HISTIMEFORMAT
13 history
14 echo HISTTIMEFORMAT
15 echo ${HISTTIMEFORMAT}
16 vim .bash_profile
17 history
18 history --help
19 history -help
20 history 10
2.3.2.3 删除指定编号的命令历史
# 用法:history [-d offset]
# 我们先打印一下最近的10条命令历史
[root@centos7 ~]# history 10
11 history -p
12 echo $HISTIMEFORMAT
13 history
14 echo HISTTIMEFORMAT
15 echo ${HISTTIMEFORMAT}
16 vim .bash_profile
17 history
18 history --help
19 history -help
20 history 10
# 我们选择删除掉编号第16条的命令
[root@centos7 ~]# history -d 16
[root@centos7 ~]# history 10
12 echo $HISTIMEFORMAT
13 history
14 echo HISTTIMEFORMAT
15 echo ${HISTTIMEFORMAT}
16 history
17 history --help
18 history -help
19 history 10
20 history -d 16
21 history 10
# 我们看上面的对比,可以看到第16条命令关于vim的已经删除掉了。
2.3.2.4 清空当中终端的命令历史
# 其实命令的历史会在我们退出终端后记录到当前用户家目录下文件名为.bash_history
# 注意这是一个隐藏文件
[root@centos7 ~]# ls -la
total 40
dr-xr-x---. 5 root root 237 Nov 18 16:52 .
dr-xr-xr-x. 17 root root 224 Nov 17 00:27 ..
-rw-------. 1 root root 1692 Nov 17 00:29 anaconda-ks.cfg
-rw-------. 1 root root 326 Nov 18 16:52 .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
# 先看一下当前终端的命令历史
[root@centos7 ~]# history
1 ll
2 history
3 man history
# 省略 ... #
26 history
# 清空当前终端的命令历史
[root@centos7 ~]# history -c
# 再次打印,就发现只有我们刚执行的唯一一条内容了
[root@centos7 ~]# history
1 history
# 这个可以恢复吗?这个我们刚才说了只有在退出时候才会写入到命令历史的记录文件,所以即使我们想恢复,也只能恢复到上次退出后记录的命令历史列表了。我们尝试一下。
# 我们先随便执行一下命令,然后查看一下命令历史,有三条我们执行过的命令
[root@centos7 ~]# echo a
a
[root@centos7 ~]# history
1 history
2 echo a
3 history
# 我们用这个命令读取.bash_history的内容 追加 到我们的命令历史中。
[root@centos7 ~]# history -r
[root@centos7 ~]# history
1 history
2 echo a
3 history
4 history -r
5 ll
6 history
7 man history
# 我们再次打印命令历史,能够清楚看到这里是追加的哦。
2.3.2.5 把当前终端的命令历史写入到文件
# 前面我们已经说过了,命令历史会在退出的时候才写入到文件中,其实我们也可以手动写入
# 我们先看一下 .bash_history 的前几行
[root@centos7 ~]# head .bash_history
ll
history
man history
...
# 这个是当前终端的结果,我们看其实大家的第一行开始就是不太一样的
[root@centos7 ~]# history
1 history
2 echo a
3 history
4 history -r
...
# 我们写入当前终端中的命令历史到文件中,注意这里是覆盖的。
[root@centos7 ~]# history -w
# 再看一次 .bash_history 的前几行
[root@centos7 ~]# head .bash_history
history
echo a
history
history -r
ll
history
...
# 现在我们看到这个跟我们history的打印结果就是一样的了。
2.3.2.6 常用选项总结
-c: 清空命令历史
-d offset: 删除历史中指定的第offset个命令,注意后面的offset必须给。
n: 显示最近的n条历史,注意这个是没有横杠的,给的n是一个数字。
-a: 追加本次会话新执行的命令历史列表至历史文件,注意是追加哦,退出终端也会执行这个操作的。
-r: 读历史文件附加到历史列表,这个是追加在当前终端命令历史之后的哦。
-w: 保存历史列表到指定的历史文件,其实就是当前用户家目录下的.bash_history
-n: 读历史文件中未读过的行到历史列表
2.4 history命令的相关环境变量
2.4.1 终端下命令历史记录的条数
# 默认有个变量决定了终端保存多少条最近的命令历史
# 查看 HISTSIZE 变量的值
[root@centos7 ~]# echo $HISTSIZE
1000
# 我们看到我们这个值是1000条,我们可以配置来改变终端的命令历史的记录条目。
2.4.2 命令历史记录的文件
# 这个记录的文件默认是在当前用户的家目录下的,也就是为~/.bash_history
# 我们其实可以手动配置修改,对应的变量是 HISTFILE
[root@centos7 ~]# echo $HISTFILE
/root/.bash_history
2.4.3 命令历史文件记录的条目数
# 写入到命令历史记录文件的条目数我们也是可以配置的,默认是1000。这个值最好大于HISTSIZE,不然你追加进去的命令历史并不能完全写到文件中。
[root@centos7 ~]# echo $HISTFILESIZE
1000
2.4.4 命令历史的记录方式
我们命令历史的记录方式是由一个变量控制的 HISTCONTROL
- ignoredups 是默认值,可忽略重复的命令,连续且相同为“重复”
- ignorespace 忽略所有以空白开头的命令
- ignoreboth 相当于ignoredups, ignorespace的组合
- erasedups 删除重复命令
[root@centos7 ~]# echo $HISTCONTROL
ignoredups
2.4.5 命令历史记录格式
- 默认我们只是记录了命令的历史,那样我们也不知道我们是什么时候记录的,所以我们可以给这些记录的内容加个时间方便我们查看。
# 这里我们要调整一个变量 HISTTIMEFORMAT ,它默认是空的
[root@centos7 ~]# echo $HISTTIMEFORMAT
# 我们调整测试一下
[root@centos7 ~]# export HISTTIMEFORMAT="%F `whoami` `echo test` "
[root@centos7 ~]# history
1 2021-11-18 root test history
2 2021-11-18 root test echo a
3 2021-11-18 root test history
# 通过修改这个值,我们重新打印命令历史后发现已经修改成我们想要的效果了。我们在执行的命令前面添加三个内容 日期 执行用户 和一个test文字。
2.4.6 持久化保存变量
我们在当前终端下设置的变量,在退出后会失效,我们如何去配置持久有效呢?我们可以通过把变量输出到登录加载文件中。
-
全局修改后所有用户都生效:/etc/profile
-
个人只针对自己的:~/.bash_profile
比如把我们给命令历史默认都输出它的执行日期、时间和执行人
# 我们修改自己个人的配置
[root@centos7 ~]# vim ~/.bash_profile
# 在最后一行添加上,然后保存退出
export HISTTIMEFORMAT="%F %T `whoami` "
# 然后退出当前终端重登或者重读这个配置文件,执行命令如下:
[root@centos7 ~]# . ~/.bash_profile
或
[root@centos7 ~]# source ~/.bash_profile
3 Linux哲学思想
其实Linux哲学思想有好多,我们跳几个主要跟我们相关的来讲。
3.1 一切皆文件
-
这里体现在,运行中的进程状态虚拟为一个伪文件系统/proc/PID,我们可以通过这个去查看运行中的进程的具体情况。
-
设备的管理也是通过文件的形式出现在文件系统中,例如:/dev/sda
-
真正存储在磁盘上的的文件
3.2 组合小程序、完成复杂任务
- 程序的功能都比较单一简单,尽量做好自己应该做的事情,比如wc 就是只是做统计的、grep是行过滤的,那么我们想过滤指定内容然后统计行数这样的任务我们就可以通过管道组合这两个小程序完成复杂的任务了。
3.3 避免与用户交互、避免令人疑惑的图形界面
- 尽量避免与用户交互能减少中间确认的环节,通过自动化的脚本我们可以充分利用CPU的时间避免空跑浪费。也能够通过脚本来避免人为操作的失误。图形界面的接口并不统一,有时候常常令人疑惑我们想要配置一个东西却不知道需要点击哪里?而命令行接口都是统一的,也因为一切皆文件,我们只需要一个文本编辑器就可以进行编辑操作。
3.4 配置都以文件形式记录
- 还是继续一切皆文件的思想,我们通过把配置统一以文件形式记录管理的方式,能够方便我们对服务程序的配置进行增删查改,也能够通过指定的配置文件存放目录来对批量对机器进行服务配置的管理,我们能够看到系统上有很多service_name.d(例如:/etc/profile.d/ /etc/zabbix/zabbix_agentd.d/ 等等)的目录,其实就是为了起到快速添加、删除指定配置段的作用。
4 Linux常用命令使用格式
- 现在的命令行格式有两种比较常见的
4.1 第一种是 命令 选项 作用参数
COMMAND [OPTIONS...] [ARGUMENTS...]
-
选项:用于启动或者关闭命令的某个、某些功能。
-
短选项:UNIX风格选项, 例如:ls命令中的-l -h
# 短选项通常可以组合写在一起,但是有些命令对组合的顺序有要求,不然会报错
# 这里我们看ls 的-l -h 顺序并没有要求
[root@centos7 ~]# ls -lh
total 8.0K
-rw-------. 1 root root 1.7K Nov 17 00:29 anaconda-ks.cfg
-rw-r--r--. 1 root root 1.9K Nov 17 11:16 initial-setup-ks.cfg
[root@centos7 ~]# ls -hl
total 8.0K
-rw-------. 1 root root 1.7K Nov 17 00:29 anaconda-ks.cfg
-rw-r--r--. 1 root root 1.9K Nov 17 11:16 initial-setup-ks.cfg
# 这里我们看到iptables命令中的短选项在打乱顺序后的执行结果不一样,其中还有报错了的情况。
[root@centos7 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0
[root@centos7 ~]# iptables -Lnv
iptables: No chain/target/match by that name.
# 这里也就印证了我们短选项有些情况下丢选项的组合后的顺序是有要求的。
-
长选项:GNU风格风格选项,例如;ls命令的--all,--human-readable
这里我们能够看到长选项的一个好处,是我们能很直观的通过选项知道,选项大致能实现的效果。并不会像短选项一样不同命令的-c可能效果都不一样,需要记忆分区。
-
BSD风格选线:使用一个字母作为参数。
# 这里我们通过我们经常使用来查看进程状态的命令ps来举例
# ps的UNIX风格
[root@centos7 ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Nov18 ? 00:00:07 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 Nov18 ? 00:00:00 [kthreadd]
root 4 2 0 Nov18 ? 00:00:00 [kworker/0:0H]
root 6 2 0 Nov18 ? 00:00:02 [ksoftirqd/0]
root 7 2 0 Nov18 ? 00:00:00 [migration/0]
# ps的BSD风格
[root@centos7 ~]# ps aux |less
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.4 128272 4284 ? Ss Nov18 0:07 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S Nov18 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< Nov18 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S Nov18 0:02 [ksoftirqd/0]
**思考:**其实为什么会有那么多种风格?
问题其实也是出在开源软件上,因为自由软件运动的关系,出现了很多出色的软件,但是这些软件编写也因为是不同程序员,他们对软件的理解自然各不相同,也就没有一个统一的标准。虽然都能在Linux系统上运行,但是也就造成了风格不一的局面,也有些命令是因为的选项非常的多。-a 到 -z 大小写等都用完了,也就只能在通过别的方式来增加对应的选项了,就会出现更加直观的长选项等等。
4.2 第二种是 命令 子命令 作用参数
COMMAND [COMMAND] [COMMAND] .... [ARGUMENTS...]
# 这种风格是现在新出命令的一种主流的使用方法。通过主命令后面跟子命令的风格来使用达到不同的执行效果
# 举两个比较常见的这种风格的命令 分别是ip 和 systemctl
[root@centos7 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00
[root@centos7 ~]# systemctl status network
● network.service - LSB: Bring up/down networking
Loaded: loaded (/etc/rc.d/init.d/network; bad; vendor preset: disabled)
Active: active (exited) since Thu 2021-11-18 16:22:00 CST; 22h ago
Docs: man:systemd-sysv-generator(8)
Process: 878 ExecStart=/etc/rc.d/init.d/network start (code=exited, status=0/SUCCESS)
Tasks: 0
4.3 常用的命令的实例说明
4.3.1 echo:用于打印行和文本
# 用法1 打印文本,给啥吐啥。很简单粗暴的命令
[root@centos7 ~]# echo nishishui
nishishui
# 用法2 显示变量,注意这里强引用和弱引用
# 弱引用,双引号能够成功打印变量的值
[root@centos7 ~]# echo "$HISTSIZE"
1000
# 强引用,单引号只会打印单纯的文本了。这里我们的区分记忆点是单引号比较单一比较直,只会直接打印内容。不会变通。
[root@centos7 ~]# echo '$HISTSIZE'
$HISTSIZE
# 用法3 启用命令选项-e 对输出结果进行一些控制操作
# 注意这里的功能 都要加上-e选项才能生效
# \t 添加打印结果添加制表符
[root@centos7 ~]# echo -e 'a\tb'
a b
# \c 输出结果不换行,默认情况下echo的输出结果都是加了换行符的
[root@centos7 ~]# echo -e 'ab\c'
ab[root@centos7 ~]#
# \n 在字符中间添加换行符
[root@centos7 ~]# echo -e 'a\nb'
a
b
- echo的颜色控制用法
# 启用-e选项后的高级用法,颜色控制
# 在bash中使用ACSII颜色 用echo 要用-e让修饰符生效 033表示ctrl的acsii码的16进制表示方式,要用反义才能让echo认识是控制符ctrl
例如: \033[31m hello \033[0m
##m:
左侧#:
3:前景色
4:背景色
右侧#: 颜色种类(字体颜色)
1,2,3,4,5,6,7
#m: 单字母时候的效果
加粗、闪烁等功能;
多种控制符,可以组合使用,彼此间用分号隔开;
例如: \033[42;35;5mhello world\033[0m
总结使用颜色的方法:
开头标准格式\033
然后配置内容[xxm;xxm;xm;..; #主体文字#
注意:多个效果分号分割
最后结束用标准格式\033[0m
\033[30m -- \033[37m 设置前景色
#字体颜色: 30--37
30: 黑
31: 红
32: 绿
33: 黄
34: 蓝
35: 紫
36: 深绿
37: 白色
\033[40m -- \033[47m 设置背景色
#字符背景颜色范围: 40--47
40:黑
41:红
42:绿
43:黄
44:蓝
45:紫
46:深绿
47:白色
# 控制效果,有很多用的很少,只是作为记录展示
\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n列
\033[nD 光标左移n列
\033[x;yH 设置光标位置x行y列
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标
\033[2J\033[0;0H 清屏且将光标置顶
4.3.2 screen 终端解绑、终端复用工具
用处:我们知道我们打开一个ssh的登陆我们就是打开了一个终端会话,如果这个ssh连接突然因为网络中断了,我们在此shell上所执行的程序就会一起结束,这对于我们来说有时候是不太理想的,比如当前shell正在编译某个程序,因此就出现了能够让当前shell跟所打开的ssh服务解绑的程序来帮我们解决这样的问题。终端复用的工具有很多我们这里介绍一下screen的主要用法。
安装:
# 注意:CentOS7 来自于base源,CentOS8 来自于epel源
#CentOS7 安装screen
[root@centos7 ~]# yum -y install screen
# CentOS8 安装screen
[20:50:48 root@centos8 ~]# dnf install epel-release
[20:51:52 root@centos8 ~]# dnf -y install screen
screen命令常见用法:
-
创建新screen会话
screen –S [SESSION_name]
-
加入screen会话
screen –x [SESSION]
这个加入有个好处是,如果别人的机器有问题,你可以加入别人的会话,然后你在别人机器上操作的时候,别人可以看到你是如何操作解决问题的。两个窗口的内容是实时显示的哦。
-
退出并关闭screen会话
exit
这个退出是完全退出的,会话将不再存在。
-
剥离当前screen会话
Ctrl+a,d
剥离只是从会话窗口中出来,但是会话是还在的,跟exit要区分开来。
-
显示所有已经打开的screen会话
screen -ls
-
恢复某screen会话
screen -r [SESSION_name]
4.3.3 date 日期、时间管理命令
用法:用来打印设置系统的时间、日期
首先我们要知道Linux存在两套时钟
-
系统时钟:由Linux内核通过CPU的工作频率进行计算的。
-
硬件时钟:主板为了系统关机后维持时间会在主板上安装一个电池,这上面维护的时间我们称为硬件时钟。
# 以时间戳的形式显示当前时间,时间戳的意思是一个相对的表示法,表示从1970年1月1日,也就是UNIX元年到现在所经历的秒数
[root@centos8 ~]#date +%s
1584689051
# 以当前的时间戳来转换成时间显示
# 用到了-d 用于显示由字符串描述的时间,而不是显示当前的时间
[20:05:07 root@centos8 ~]# date -d @`date +%s`
Tue Nov 9 20:07:16 CST 2021
# 用特定的时间戳转换成指定格式的日期时间
[20:07:16 root@centos8 ~]# date -d @1584689051 +%F_%T
2020-03-20_15:24:11
# 以指定的日期转换成时间戳
[20:08:07 root@centos8 ~]# date -d "2021-11-09" +%s
1636387200
# 设置时间 格式是 年月日 [时:分:秒]
[root@centos8 ~]# date -s "20180101"
Mon Jan 1 00:00:00 CST 2018
[root@centos8 ~]# date
Mon Jan 1 00:00:01 CST 2018
[root@centos8 ~]# date -s "20180101 10:00:00"
Mon Jan 1 10:00:00 CST 2018
[root@centos8 ~]# date
Mon Jan 1 10:00:01 CST 2018
- clock,hwclock: 显示硬件时钟
-s, --hctosys #以硬件时钟为准,校正系统时钟 记忆点是设置去system
-w, --systohc #以系统时钟为准,校正硬件时钟
# 其实clock 和 hwclock 是同一个文件
[20:13:41 root@centos8 ~]# ll `which clock`
lrwxrwxrwx. 1 root root 7 Jan 21 2021 /usr/sbin/clock -> hwclock
4.3.4 ifconfig 网络接口管理类
用法:用来管理查看网络接口,属于ifcfg家族中的命令。
# 我们通过yum可以看到这个命令是由net-tools这个安装包提供的,有时候我们最小化安装没有这个ifconfig命令的时候,可以通过yum -y install net-tools解决。
[root@centos7 ~]# yum provides ifconfig
net-tools-2.0-0.25.20131004git.el7.x86_64 : Basic networking tools
Repo : @anaconda
Matched from:
Filename : /usr/sbin/ifconfig
- 基本使用方法:
# 查看指定网络接口的信息
# 使用格式:ifconfig [INTERFACE]
[root@centos7 ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.153 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::f4a2:22f5:b672:5b35 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:cd:8e:8f txqueuelen 1000 (Ethernet)
RX packets 16833 bytes 9207091 (8.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8595 bytes 1275333 (1.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 查看所有的网络接口的信息,默认ifconfig命令是显示激活的
# -a 参数可以看到所有 up|down 状态的接口
[root@centos7 ~]# ifconfig -a
# 配置指定的网络接口
# 使用格式:ifconfig interface [aftype] options | address ...
ifconfig IFACE IP/MASK [up|down]
ifconfig IFACE IP netmask NETMASK
# 例子
ifconfig eth1 192.168.10.100/24 up
ifconfig eth1 192.168.10.101 netmask 255.255.255.0 up
4.3.5 export 环境变量输出
用法:设置变量的导出属性
- 本地变量:
# 我们知道命令行中声明一个变量 name=VALUE
# 例如:我们声明一个 name=lx
[root@centos7 ~]# echo $name
[root@centos7 ~]# name=lx
[root@centos7 ~]# echo $name
lx
# 但是我们在当前终端下再打开一个新的bash就会发现 name的变量又变成空的了
[root@centos7 ~]# bash
[root@centos7 ~]# echo $name
**总结:**上面我们就可以看到本地变量只能针对当前的shell,对其子shell无效。
- 环境变量:
# 那么我们思考一个方法,能否让我们的name变量在子shell中也能生效呢?
# 这个就需要我们的export命令,来输出这个变量为一个环境变量了
# 用法1:
# 先变量赋值
[root@centos7 ~]# name=lx
# 再export 输出变量
[root@centos7 ~]# export name
# 用法2:
# 一步到位,直接变量赋值、并输出
[root@centos7 ~]# export name=lx
# 通过这样的方法,我们就可以在子shell上也让这个变量生效了。这个用法有什么具体的用法呢?
# 我们通常安装一个第三方的程序,需要把他输出到PATH变量上才能够直接再bash中使用,这里我们就可以在/etc/profile文件中修改PATH变量的值并重新输出了。
# 例如:
export PATH=/usr/local/go/bin:$PATH
5 Linux发行版的系统目录名称命名规则以及用途。
5.1 为什么需要文件系统?
前面我们提到了Linux的哲学思想中一切皆文件,那么面对这么多的文件我们如果有效的去查找到我们想要查找的文件呢?如果快速的知道他们存放在哪里让操作系统去读取到磁盘上的数据。这个就需要一套系统来组织这些文件,也就是我们常说的文件系统。
5.2 文件系统目录需要有要求吗?
在一开始文件系统的基本目录都是没有要求的,开源也就意味着自由,那么各个厂家也就会按照自己的理解去组织这样的文件系统,但是这样对于用户来说却是痛苦的,因为他们需要适应不同厂家的文件系统的存放规律,使得用户的学习、使用成本大大提高,也正因为这样的问题,就出现了文件系统层次化标准,即FHS。
5.3 Linux文件系统中的一些主要的目录
/bin:供所有用户使用的基本用户命令程序,二级制命令文件
/sbin:系统管理使用的二进制程序
/boot:启动引导器的静态文件
/dev:存放特殊设备文件和设备文件,一切皆文件,设备也是虚拟为文件的。
/etc:主机特有的系统配置文件存放目录
/home:普通用户的家目录,每个用户在这个目录下通常会有一个跟自己同名的目录
/lib:基本的共享库或基础的共享库和内核模块
/lib64:对于32位系统这个是可选目录,对64位系统为必要存在的目录,为/bin /sbin 目录下的文件提供共享库
/mnt:用于外接存储设备在文件系统上提供的挂在点的目录(这里偏向硬盘类的)
/media:便携性设备挂载点
/opt:第三方非关键性程序的安装位置(现在有点名存实亡的感觉)
/root:管理员的家目录,可有可无,因为管理员最好是不要登录系统的。
/srv:为当前系统提供服务的数据,系统特有的。大部分情况下用不到。
/tmp:为那些用到临时文件的程序提供的目录。因此这个目录所有用户都用得到,所以所有用户对这个目录都能执行写入操作。此目录有特殊权限。
/usr:全局共享只读资源目录,这个目录更像现在的第三方软件的安装目录。有自己的层级结构。
/var:经常发生变化的数据文件目录
/proc:内核和进程信息的虚拟文件系统,为了保证一切皆文件而特殊设定的
/sys:sysfs虚拟文件系统提供了一种比/proc更为理想的访问内核数据的路径,通过、sysfs把原来全部由proc目录下提供的输出的目录,分支了一部分到sysfs让一些数据在访问的时候更加的灵活。
注意:CentOS 7 以后版本目录结构变化
- /bin 和 /usr/bin
- /sbin 和 /usr/sbin
- /lib 和/usr/lib
- /lib64 和 /usr/lib64
[root@centos8 ~]# ls /bin /sbin /lib /lib64 -ld
lrwxrwxrwx. 1 root root 7 Nov 3 2020 /bin -> usr/bin
lrwxrwxrwx. 1 root root 7 Nov 3 2020 /lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 2020 /lib64 -> usr/lib64
lrwxrwxrwx. 1 root root 8 Nov 3 2020 /sbin -> usr/sbin
[root@centos6 ~]#ls /bin /sbin /lib /lib64 -ld
dr-xr-xr-x. 2 root root 4096 Mar 20 09:14 /bin
dr-xr-xr-x. 11 root root 4096 Dec 12 2018 /lib
dr-xr-xr-x. 9 root root 12288 Mar 20 09:13 /lib64
dr-xr-xr-x. 2 root root 12288 Mar 20 09:14 /sbin
5.4 文件系统的目录的命名规则:
-
文件名称大小写敏感
-
文件名最长255个字节(汉字一般三个字节,也就是85个汉字?)
-
包括路径在内文件名称最长4095个字节
-
除了斜杠(也就是 / )的所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用
这个再举些例子来说明一下上面的规则加深一下印象:
[root@centos7 ~]# touch f1 F1
[root@centos7 ~]# ll
total 8
-rw-------. 1 root root 1692 Nov 17 00:29 anaconda-ks.cfg
-rw-r--r--. 1 root root 0 Nov 20 10:42 f1
-rw-r--r--. 1 root root 0 Nov 20 10:42 F1
# 通过上面我们可以看到linux中对大小写是敏感的
这里我们再看看Windows
我们看到f1 和 F1 提示是否替换,这里最后只会留下一个目录。表示Windows对大小写其实并不敏感。
# 上面我们知道最长255个字节,我们尝试一下超过会报什么错误
[root@centos7 ~]# touch 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
touch: cannot touch ‘1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111’: File name too long
[root@centos7 ~]# touch 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
# 这里我们输入了最长86个汉字,如果超过86就会报错,基本验证我们通常说的一个汉字三个字节表示。
[root@centos7 ~]# touch 今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今
# 这个是87个
[root@centos7 ~]# touch 今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天
touch: cannot touch ‘今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天今天’: File name too long
上面我们讲到了,除了/,所有字符都是有效的,可为什么有些字符需要引号来引用呢?
# 这里创建一个名字奇怪的文件
[root@centos7 ~]# touch "\ 123\ test"
[root@centos7 ~]# ll
total 8
-rw-r--r--. 1 root root 0 Nov 20 10:58 \ 123\ test
# 我们看到上面这个文件是存在的,但是我们如果直接输入它的文件名会发现,并不能找到这个文件。
[root@centos7 ~]# ll \ 123\ test
ls: cannot access 123 test: No such file or directory
# 这里我们就需要用到双引号来使得bash能够把我们输入的内容当做一个整体来识别。
[root@centos7 ~]# ll "\\ 123\\ test"
-rw-r--r--. 1 root root 0 Nov 20 10:58 \ 123\ test
第一次编辑完成时间 2021年11月20日12:00:57 水平有限,如果错误欢迎指正、修改,互相学习进步。