basis Liunx快速入门

基础部分

Linux&Unix

​ 说起Linux,就不得不提Unix操作系统。

Unix系统号称世界上最稳定的系统,就连苹果公司也从中获取灵感开发出了移动端大名鼎鼎的IOS

Unix操作系统有一个特点即为多用户多任务,同一时刻允许多个用户同时使用该系统且互不干扰。

Linux的全称为GNU/Linux,内核于1991年10月5日首次发布,是基于Unix系统开发而来的。

​ 它的基本思想是一切皆文件,其描述如下:

​ 每个文件都有确定的用途。其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令硬件软件设备、操作系统进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。

Linux全称中的GNU是一个开源项目名称,由Richard Stallman在1983年9月27日公开发起,它的目标就是创建一套完全自由的操作系统,在其中有一条GPL条款,该条款大体思想如下:

​ 可以自由的使用,复制,修改,发布GNU项目下的软件。

​ 所有GNU软件都有一份在进制其他人添加任何限制的情况下授予所有权利给任何人的协议条款。

​ 1. 你有自由以任何目的来运行该程序

​ 2. 你有修改程序满足自己需求的自由

​ 3. 你有权利重新发布副本,既可以白送也可以收取一定的费用

​ 4. 你有权利发布该程序修改过的版本,从而让其他人得益于你的改进

​ 所以Linux的源代码完全开源,历经这么多年的沉淀已经非常优秀,大量的程序员对研究它乐此不疲,未来Linux也是肯定会越来越优秀。

Os&Kernel&系统调用接口

Os即为操作系统的意思,操作系统是一个用来协调,管控计算机硬件和软件资源的系统程序。它位于硬件和应用程序之间。

​ 每个操作系统都有一个内核Kernel,它是为应用程序提供对计算机硬件安全访问的一个软件,负责所有的物理资源。包括:文件系统,内存管理,设备管理和进程管理。

​ 因此我们一般将计算机分为三层:

image-20210128161924772

​ 一个应用软件如果想操纵底层硬件,必须经过系统调用接口发起系统调用,再由系统调用操纵内核,最后经内核帮助调用底层的系统硬件。

image-20210128162658049

​ 所以说操作系统的调用接口是服务于应用层面的软件的,但其本身属于操作系统这一层。

​ 在内核进行操纵硬件时,实际上会切换CPU状态,内核态与用户态,详情参见:计算机基础

CentOS安装

​ 首先下载安装虚拟机程序VM,以及CentOS7.3镜像,这里对VM提供了MacWindows两个平台的下载地址:

​ 具体关于VM的安装过程不再进行演示,大致都相同。

​ 当下载完Centos7.3镜像之后,我们开启手动安装CentOS7.3的过程:

image-20210228203841004

​ 然后敲击回车进行等待。

image-20210228204006672 image-20210228204231793

​ 选择开发者工具:

image-20210228204204232

​ 接下来开始安装:

image-20210228204256610

​ 然后是创建用户和ROOT密码:

image-20210228204335983

​ 创建用户:

image-20210228204506520

​ 设置ROOT密码:

image-20210228204542481

​ 等待执行安装即可。

image-20210228210051267

​ 由于我们没有安装GUI,所以当重启完成后会让你登录当前系统的用户名和密码,输入完成后即可进行登录。

基本介绍

Terminal

​ 不出意外的话现在我们已经位于终端界面了,如果你是选择了带有GUI的安装方式,即可在桌面上单击鼠标右键,选择Open Terminal打开你的第一个终端,或者使用快捷键CTRL + SHIFT +N来打开你的第一个终端。

​ Linux终端又叫虚拟控制台,Linux终端采用字符命令行方式工作,用户通过键盘输入命令,通过Linux终端对系统进行控制

Linux下可以开启多个终端,使用CTRL + ALT + [ F1-F6 ]进行终端的切换。

用户切换

​ 在Linux下有一个根用户ROOT,拥有最高权限。当使用普通用户登录系统后提示符为$,而当使用ROOT用户登录系统后提示符为#

​ 使用su命令切换至ROOT用户进行登录:

# 普通用户
[CentOS7.3@localhost ~]$

# ROOT用户
[root@localhost CentOS7.3]#

​ 在登录信息前缀中我们不仅可以看到当前登录的用户是普通用户还是ROOT用户,并且还包含当前的路径信息。

​ 我们以ROOT用户进行举例:

[root@localhost CentOS7.3]#

[用户@登录地址 路径]提示符

​ 在接下来的示例中,我将永久使用ROOT用户进行操作,且将前缀符缩写为T >

命令基础

​ 在Linux中,命令语法格式如下所示:

命令 [选项] [参数]

# 注意,在Linux中,所有的大小写都是严格区分的,这与Windows有很大区别

​ 释义如下:

命令:要求Linux(Unix)执行的指令

选项:使用选项规定命令究竟如何执行,如命令ls -a 代表在查看命令的基础上查看所有文件且包括隐藏文件

参数:使用参数规定命令影响的操作对象,如参数ls -a / 代表查看根路径下的所有文件且包括隐藏文件

​ 以下是一些与系统和操作相关的基础命令:

命令/快捷键 描述
init 0 关闭当前Linux系统
init 6 重新启动当前Linux系统,亦可使用命令reboot
cat /etc/redhat-release 查看当前系统版本信息
clear 清屏,亦可使用快捷键CTRL + R执行
man 命令 查看某一命令的帮助信息
命令 —help 查看某一命令的帮助信息
CTRL + C 对一条正在执行的命令进行终止

​ 以下是一些与日期相关的基础命令:

命令 描述
date 查看当前日期
date ‘月日时分年’ 设定当前时间,格式为月日时分年,必须具有ROOT权限
hwcclock -s 将当前时间与硬件时间进行同步
cal 查看万年历

目录文件篇

目录结构

​ 在LinuxUnix操作系统中,所有的文件和目录都被组织成一个以根/节点开始的倒置的树状结构。

Linux中的目录相当于Windows中的文件夹,目录中存放的既可以是文件也可以是其他子目录。

Linux下的顶层目录用/来表示,俗称为根目录。在Linux下只能有一个,而Windows下可以有多个,相当于C:\\ D:\\这样的盘符概念。

​ 使用.代表当前目录,即用户工作的工作目录

​ 使用..代表上层目录,即当前目录的上一层目录

​ 使用*表示选中所有文件及目录,如/*

重要目录

​ 使用ls /可查看根目录下的目录和文件,包含重要目录:

T > ls /
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

​ 一些重要目录的解释:

目录名称 描述 使用方向
/bin 存放常用的可执行文件binary二进制的可执行文件 不推荐使用
/sbin 存放系统的可执行文件super binary系统的命令 不推荐使用
/usr 存放常用的可执行文件binary二进制的可执行文件 推荐使用
/dev 设备目录,如新插入的磁盘、U盘等都会在该目录中以文件形式进行存放 不推荐使用
/home 家目录,ROOT用户为/root,普通用户家目录均存放至此,可用~进行缩写 推荐使用
/mnt 挂载点目录,通常可移除式硬件会挂载在此目录或/media目录下 不推荐随意使用
/media 挂载点目录,通常可移除式硬件会挂载在此目录或/mnt目录下 不推荐随意使用
/proc 存放内存中的数据,如系统核心、外部设备、网络状态等 不推荐使用
/srv 服务启动之后需要访问的数据目录 不推荐随意使用
/etc 配置文件目录,不建议在此目录下存放可执行文件 不推荐随意使用
/tmp 临时文件存放目录 推荐使用
/var 存放系统执行过程中经常变化的文件 不推荐使用
/boot 存放Linux系统启动时会用到的文件 不推荐使用
/lib 系统运行时使用的函数库目录 不推荐使用
/opt 给主机额外安装软件预留的目录,但是一般情况下都不会使用它 推荐使用

​ 个人使用建议:

目录 使用建议
/home/用户家目录 建议存放一些个人文档、视频、资料等
/usr/local 建议存放一些个人软件
/usr/local/bin 建议存放一些非系统性的个人软件的快速启动软链接
/usr/local/tmp 建议存放一些个人可能暂时不会用到的文件
/etc/ 建议存放一些软件的配置文件
/tmp/ 建议存放一些软件所产生的临时文件

目录命令

​ 以下是一些与目录相关的基础命令:

命令 描述
pwd 目录 查看当前所在目录
cd 目录 切换至某一目录下
ls 目录 查看当前目录下所有内容,不包括隐藏内容

cd系列的命令用于切换工作目录,常使用的选项和参数如下所示:

命令 描述
cd 直接使用cd时,返回到当前登录用户的家目录
cd ~ 返回到当前登录用户的家目录
cd .. 返回上级目录
cd - 返回上一次所在的目录中

ls系列的命令用于查看目录下的内容,常使用的选项和参数如下所示:

命令 描述
ls 直接使用ls时,查看当前目录下的文件及目录
ls -l 查看当前目录下的文件及目录的详细信息
ls -d 查看当前目录下的子目录,如加上-l参数,则可查看子目录详细信息
ls -a 查看当前目录下的所有内容,且包括隐藏内容,注意!Linux下以.开头的文件均属于隐藏文件

文件命令

​ 以下是查看文件内容的基本命令:

命令 描述
wc -l 文件路径 查看文件中内容的行数
cat 文件路径 查看文件中全部内容
more 文件路径 查看文件中内容,根据屏幕占比进行百分比显示
less 文件路径 查看文件中内容,使用上下键来进行翻页
head -行数 文件路径 查看文本文件内容(默认头十行)选项是 -1则显示一行
tail -行数 文件路径 查看文本文件内容(默认尾十行)选项是 -1则显示一行
tail -f 文件路径 查看文件内容,并动态监测内容变化

创建/删除

​ 创建的基础命令如下:

命令 描述
mkdir 目录名 创建一个空目录
mkdir -p 目录名1/目录名2 创建一串空目录
touch 文件名 创建一个空文件

​ 删除的基本命令如下,但不建议使用这些命令,应当将不用的项目存放至/usr/local/tmp目录中:

命令 描述
rm 文件名 删除指定文件,并弹出提示
rm -f 文件名 删除指定文件,不弹出提示
rm -r 目录名 递归的删除目录,好像必须为空目录,记不清了
rm -rf 目录名 删除一个目录树,包括所有文件,且不进行提示(禁用命令,删库跑路)
rm -rf 目录名/* 删除一个目录下的所有文件,但保留这个空目录,不进行提示(禁用命令,删库跑路)

移动/拷贝

​ 移动的基本命令如下,除开可以对项目进行移动外还可以进行重命名操作:

命令 描述
mv 原项目路径 目标路径 将原项目移动动目标路径之下,如果目标路径不存在,则创建
mv 原项目名称 新项目名称 如原项目路径与目标路径均属于同一目录下,则相当于重命名操作

​ 拷贝的基本命令如下:

命令 描述
cp 原项目路径 目标路径 拷贝项目至目标路径中,如果目标路径不存在,则创建
cp -r 原目录路径 目标路径 递归的拷贝目录及子内容至目标路径中,一般来说该命令比较常用

项目大小

​ 以下是查看目录或文件大小的命令:

命令 描述
du -sh 目标路径 查看目标的大小,以KB为单位
du -ah 目标路径 查看目标下所有子内容的大小,以KB为单位

连接/过滤/head/tail

​ 使用管道符|来进行连接操作,它的作用是将当前命令执行结果交由下一命令继续操作,待操作完成后再打印出来。

grep命令是过滤命令,使用正则进行过滤。

​ 如,使用管道符配合grep命令:

# 查看根目录下所有项目
T > ls /
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

# 查看根目录下s开头的所有项目
T > ls / | grep ^s
sbin
srv
sys

# 反向过滤,选项-v 查看根目录下不以s或者o开头的项目名
T > ls / | grep -v [^so]
bin  boot  dev  etc  home  lib  lib64  media
mnt  proc  root run  tmp  usr  var

head命令可以从头部提取几条信息进行查看。

​ 除了在读取文本的时候直接使用,也可以和管道符进行连接配合其他命令使用:

# 查看根目录下的第一个项目
T > ls / | head -1
bin

tail命令可以从底部提取几条信息进行查看。

​ 除了在读取文本的时候直接使用,也可以和管道符进行连接配合其他命令使用:

# 查看根目录下的最后一个项目
T > ls / | tail -1
var

覆写/追写

​ 覆写与追写是比较常用的为一个文件写入内容的命令,如下表所示:

命令 描述
>> 追写命令,将打印内容写入文件中,如果文件不存在则自动创建,如果文件中已有内容,该操作不会覆盖原有内容,而是在原有内容后进行追写
> 覆写命令,将打印内容写入文件中,如果文件不存在则自动创建,如果文件中已有内容,该操作将覆盖原有内容进行新内容的写入

​ 这两个命令通常搭配其他命令一起使用,如echocat等,示例如下:

# 追写
T > echo 'Hello,World;' >> new_file.txt
T > cat new_file.txt
Hello,World;

# 覆写
T > echo 'Hello,Linux;' > new_file.txt
T > cat new_file.txt
Hello,Linux;

执行脚本

​ 执行一个脚本有如下两种方法,但是在执行前一定要确保该文件有可执行权限:

# 方式1
sh 文件名

# 方式2
./ 文件名

项目查找

​ 项目查找命令可分为whereis命令与find命令两大类。

​ 使用whereis命令查找名为passwd的文件:

T > whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz

​ 使用find命令的一些演示操作:

# 递归查找根路径下名为passwd的项目
T > find / -name passwd

# 递归查找根路径下大于10M的项目
T > find / -size +10240k

# 递归查找根路径下小于10M的项目
T > find / -size -10240k

# 将查找到的项目进行删除
T > find / -name \*.pyc -exec rm -i {} \;

# 将查找到的目录权限设置为750
# 查找路径:/usr/local 查找类型:-type d目录文件 查找名称:-name mysql目录
# 连接操作:-exec 操作类型:chmod 750 操作源:{},查找到的项目
T > find /usr/local -type d -name mysql -exec chmod 750 {} \;

# 将查找到的文件进行删除
# 查找路径:/home/CentOS7.3 查找类型:! -type d 不是目录的项目 查找名称:-name 以.jpg结尾的项目
# 连接操作:-exec 操作类型:rm -i 操作源:{},查找到的项目
T > find /home/CentOS7.3 ! -type d -name *.jpg -exec  rm -i {} \;

VIM编辑器篇

基本介绍

vim编辑器作为Linux的自带编辑器可以说十分强大,也被很多追捧的人誉为编辑器之神,它的操作方式非常具有特色但是学习难度较大,所以本章节只会介绍基础操作,感兴趣的小伙伴可以自行学习这一技能,绝对加分不少。

vim编辑器分为两种,一种叫vi,一种叫vim(vi modify)

vimvi的基本用法相同,但是某些场景下更为强大。

​ 使用vim编辑器的基本语法:

vim 文件路径
# 文件不存在将创建

​ 由于我们是使用的最小安装方式,所以默认只安装了vi但是并未安装vim,所以需要进行手动安装yum,命令如下:

T > yum install vim -y

模式介绍

vim有三种模式,如图所示:

image-20210131000711781

移动跳转

​ 以下是命令行模式中常用的移动与跳转指令:

指令 描述
h 光标向左移动
l 光标向右移动
k 光标向上移动
j 光标向下移动
b 光标向前移动一个单词
w 光标向后移动一个单词,光标位于单词开头
e 光标向后移动一个单词,光标位于单词结尾
f x 向后查找第一个以x开头的单词
nh 光标向左移动n个字符
nl 光标向右移动n个字符
nk 光标向上移动n个字符
nj 光标向下移动n个字符
nb 向前移动n个词语
nw 向后移动n个词语,光标位于单词开头
ne 向后移动n个词语,光标位于单词结尾
f n x 向后查找第n个以x开头的单词
0 跳到当前光标所在行的首部
^ 跳到当前光标所在行的第一个非空白字符处
$ 跳到当前光标所在行的尾部
$_ 跳到当前光标所在行的最后一个个非空白字符处
gg 跳到文件第一行
G 跳到文件最后一行
nG 跳到文件的第n行
H 光标移动到当前屏幕展示内容区域第一行的第一个字符
M 光标移动到当前屏幕展示内容区域中间行的第一个字符
L 光标移动到当前屏幕展示内容区域最后一行的第一个字符
zz 将光标所在行设为页面中心

复制粘贴

​ 以下是命令行模式中常用的复制和粘贴指令:

指令 描述
y 复制当前光标下的内容
p 粘贴y的内容
yy 复制一整行
yydd 剪切一整行
p 在光标所在行的下一行粘贴yy的内容
P 在光标所在行的上一行粘贴yy的内容
nyy 复制n行
yit 复制当前光标所在行中标签的内容
yat 复制当前光标所在行的完整标签
yG 从当前行,复制到最后一行

删除指令

​ 一些是命令行模式中进行删除的一些指令:

指令 描述
x 删除当前光标所在处的字符
X 删除当前光标所在处左边的字符
dd 删除光标所在的行,一直摁住一直删除
ndd 删除光标所在行下的n行
dgg 删除从光标处到文本开头的内容
dG 删除从光标处到文本结尾的内容
cc 删除当前光标所在行,并进入编辑模式

撤销重做

​ 以下两个指令是在命令行模式下进行撤销和重做的指令:

指令 描述
u 撤销上一步操作
ctrl + r 重做撤销操作

编辑模式

​ 在命令行模式下输入以下指令,即可进入编辑模式,在编辑模式下摁下ESC即可回退到命令行模式:

指令 描述
i 光标前进行插入,进入编辑模式
a 光标后进行插入,进入编辑模式
I 当前行首插入,进入编辑模式
A 当前行尾插入,进入编辑模式
o 当前行下方插入,进入编辑模式
O 当前行上方插入,进入编辑模式
cc 删除当前光标所在行,并进入编辑模式

扩展模式

​ 在命令行模式中按下:即可进入扩展模式,在扩展模式下摁下ESC即可回退到命令行模式:

命令 描述
:w 保存
:w! 强制保存
:q 退出
:q! 强制退出
:wq 保存并退出
:wq! 强制保存并退出
:set nu 显示行号
:set spell! 打开拼写检查

查找替换

​ 以下是查找替换的相关指令,是在扩展模式下做的:

命令 描述
:/单词 进入搜索模式,正向搜索,n是下一个,N是上一个
:?单词 进入搜索模式,反向搜索,n是下一个,N是上一个
:%s/旧/新/g 全局搜索旧单词,替换为新单词
:开始行,结束行s/旧/新/g 指定行数搜索旧单词,替换为新单词
:开始行,行数s/旧/新/g 从当前行开始,对指定行数中的旧单词替换为新单词,+行数是向下,-行数是向上

常用操作

​ 可能上面例举的这些操作让你感到一些头晕,下面将对经常用到的操作进行汇总。

​ 只要记住下表中的指令或命令,你对vim已经可以进行基本的操作了:

指令/命令 描述
h 光标向左移动
l 光标向右移动
k 光标向上移动
j 光标向下移动
dd 删除光标所在的行,一直摁住一直删除
ndd 删除光标所在行下的n行
u 撤销上一步操作
ctrl + r 重做操作
yy 复制光标所在的行
P 粘贴内容到光标所在行的上一行
p 粘贴内容到光标所在行的下一行
gg 跳到文件第一行
G 跳到文件最后一行
nG 跳到文件的第n行
$ 跳到当前光标所在行的尾部
0 跳到当前光标所在行的首部
H 光标移动到当前屏幕展示内容区域第一行的第一个字符
M 光标移动到当前屏幕展示内容区域中间行的第一个字符
L 光标移动到当前屏幕展示内容区域最后一行的第一个字符
/ 进入搜索模式,支持正则表达式。N是上一个,n是下一个
i 光标前进行插入,进入编辑模式
a 光标后进行插入,进入编辑模式
o 当前行下方插入,进入编辑模式
cc 删除当前光标所在行,并进入编辑模式
:q! 强制退出
:wq! 强制退出并保存
:set nu 显示行号(扩展模式)
:set spell! 打开拼写检查
:%s/旧/新/g 全局搜索旧单词,替换为新单词

用户群组篇

用户信息文件

Linux下一切皆文件,当使用useradd命令新建一个用户的话,其实内部也会发生一些变化。

​ 举例,当我们使用新建名创建出Jack后,变化如下:

T > useradd Jack

1.用户信息文件:/etc/passwd

T > tail -2 /etc/passwd

CentOS7.3:x:1000:1000:CentOS7.3:/home/CentOS7.3:/bin/bash
Jack:x:1001:1001::/home/Jack:/bin/bash

​ 在此文件中,每一行代表一个用户的信息,并且以冒号为分隔符,将一行信息分为七段。

​ 第一段:用户名

​ 第二段:密码占位符,如果看到一个x,其实密码已经被映射到/etc/shadow文件中

​ 第三段:UID(user id),即用户识别码,系统管理员是0,1-999为系统用户,1000-65535为普通用户

​ 第四段:GID,(group id),即用户组识别码,不同的用户可以属于同一个组,并且享有该组的共同权限

​ 第五段:COMMENT账号描述信息

​ 第六段:家目录路径,普通用户在/home下,而root用户在/root下

​ 第七段:这一段是一个可执行文件的路径,如果该段内容是/bin/bash则说明该用户可以登录该系统,而如果是在/sbin/nologin下面则说明该用户不可以登录该系统

2.用户密码文件:/etc/shadow

T > tail -2 /etc/shadow

CentOS7.3:$6$nYz1aYs6nlkjJI9C$8yjvPciCiCP3jDBYVsu2QN3GZ4SElIXhdut8xYPW3o2JBxbyyyNmbTi9G.JO7Zh.BQnH5ROJWZNLK56Ul1RW70::0:99999:7:::
Jack:!!:18687:0:99999:7:::

​ 在此文件中,每一行代表一个用户的密码信息,并且以冒号为分隔符,将一行信息分为九段。

​ 第一段:用户名

​ 第二段:经过加密的密码,!!代表没有密码

​ 第三段:最近一次密码变更时间,从1970年至今的天数

​ 第四段:密码最少使用的天数

​ 第五段:密码最长使用的天数

​ 第六段:密码过期预警天数

​ 第七段:密码过期后的宽恕时间,在宽恕时间内该密码依旧可用的天数

​ 第八段:账号失效日期

​ 第九段:保留段,未被使用的段

3.组文件:/etc/group

T > tail -2 /etc/group

CentOS7.3:x:1000:CentOS7.3
Jack:x:1001:

​ 在此文件中,每一行代表一个群组的信息,并且以冒号为分隔符,将一行信息分为四段。

​ 第一段:组名,组名默认为用户名,可以说一个用户就是一个组

​ 第二段:组密码占位符,其真实密码是存放在/etc/gshadow中

​ 第三段:组ID,具有唯一性

​ 第四段:组默认成员,默认的组成员就只有自己

4.组密码文件:/etc/gshadow

T > tail -2 /etc/gshadow

CentOS7.3:!!::CentOS7.3
Jack:!::

​ 在此文件中,每一行代表一个群组的密码信息,并且以冒号为分隔符,将一行信息分为四段。

​ 第一段:用户组的名词

​ 第二段:用户组密码,如果为!则代表没有密码

​ 第三段:用户组管理者,如果有多个管理者则用,进行分割

​ 第四段:组默认成员,默认的组成员就只有自己

5.用户家目录:/home/userName

T > ls /home

CentOS7.3  Jack

6.用户邮箱:/var/spool/mail

T > ls /var/spool/mail
CentOS7.3  Jack

​ 在了解完上述内容之后,我们发现其实useradd这条命令就是修改了这一系列文件,那么我们其实也可以手动的修改文件内容达到新增用户的目的。

​ 第一步:编辑基本用户信息,vim /etc/passwd打开该文件,按下G跳转到最后一行,按下o进行编辑,写入以下内容后按下ESC键进入命令模式,按下:进入扩展模式,输入wq!进行保存退出。

ken:x:1002:1002:this is test user:/home/ken:/bin/bash

​ 第二步:编辑用户密码相关,vim /etc/shadow,重复上述步骤,写入内容如下:

ken:!::ken

​ 第三步:编辑用户组相关,vim /etc/group,重复上述步骤,写入内容如下:

ken:x:1002:ken

​ 第四步:编辑用户组密码相关,vim /etc/gshadow,重复上述步骤,写入步骤如下:

ken:!::

​ 第五步 :创建用户家目录,命令如下:

T > mkdir /home/ken
T > cp -r /etc/skel/.[!.]* /home/ken

T > ls -a /home/ken
.  ..  .bash_logout  .bash_profile  .bashrc  .mozilla

​ 第六步:创建用户邮箱文件,命令如下:

T > touch /var/spool/mail/ken

​ 尝试使用su命令进行切换账户:

T > su ken
T > cd ~
T > id

用户相关命令

​ 首先是一些与当前登录用户相关的命令:

命令 描述
who 列出目前所有登录该系统的用户
whoami 显示目前您所使用的用户
id 用户名 查看某一用户的信息,若不指定用户名,则目前您所使用的用户信息
su 用户名 从当前正在使用的用户切换至另一用户,如未指定用户名,则默认切换至ROOT用户,如之前从未使用ROOT用户,则可对其设定初始密码
history 展示当前用户所输入的历史命令

useradd系列的命令用于新增一位用户,常使用的选项和参数如下所示:

命令/选项 描述
useradd 选项 用户名 使用默认方式创建新用户
选项:-u 指定用户的uid
选项:-g 指定用户所属的群组
选项:-d 指定用户的家目录
选项:-c 指定用户的备注信息
选项:-s 指定用户所用的shell(是否可登录)
选项:-G 指定用户所属的附加组

​ 示例演示:

T > useradd -u1003 -gken -d/home/Tom -cTom -s/bin/bash Tom
# 创建用户id是1003,群组为ken的群组,家目录为/home/Tom,账号描述信息是Tom,登录状态是允许登录,用户名是Tom

T > id Tom
uid=1003(Tom) gid=1002(ken) 组=1002(ken)

userdel命令用于删除一位用户:

命令/选项 描述
userdel 选项 用户名 删除某一用户,但保留家目录
选项:-r 删除用户的同时连家目录一起删除,一般来说都会带上该参数

​ 示例演示:

T > userdel -r Tom

usermod系列的命令用于更改一位用户的权限或信息,常使用的选项和参数如下所示:

命令/选项 描述
usermod 选项 用户名 修改现有的用户相关信息及权限
选项:-u 修改用户UID
选项:-g 修改用户所属的GID
选项:-d 修改用户的家目录(如果家目录修改,无法通过su切换该用户)
选项:-c 修改用户的备注信息
选项:-s 修改用户所用的shell(登录状态)
选项:-G 将用户所在的组加入到另一个指定的组
选项:-L 锁定用户,不能登录
选项:-U 解锁用户,可以登录
选项:-o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同

​ 示例演示:

T > id Jack
uid=1001(Jack) gid=1001(Jack) 组=1001(Jack)

T > usermod -u1020 -gCentOS7.3 -c新描述信息 Jack

T > id Jack
uid=1020(Jack) gid=1000(CentOS7.3) 组=1000(CentOS7.3)

群组相关命令

groupmod系列的命令用于更改一个群组的权限或信息,常使用的选项和参数如下所示:

命令/选项 描述
groupmod 选项 群组名 修改现有的组名相关信息及权限
选项:-g 修改群组的GID
选项:-n 修改群组的名称
选项:-G 将用户加入到一个指定的组中
选项:-L 锁定群组,该群组下的用户将不能登录
选项:-U 解锁群组,该群组下的用户将可以登录

groupdel命令用于删除一个群组:

命令 描述
groupdel 群组名 删除一个已有的群组

权限管理篇

查看权限属性

​ 使用ls -l命令查看一个项目的详细信息,如下所示:

T > touch test
T > ls -l
总用量 0
-rw-r--r--. 1 root root 0 3月   1 13:58 test

-rw-r--r—.就是权限信息,分为10个部分,描述如下:

第一部分:第1位置,-是普通文件,d是目录文件,b是块文件,p是管道文件,l是软链接

第二部分:第2、3、4位,代表属主的权限,-是无权限,r是读权限,w是写权限,x是可执行权限

第三部分:第5、6、7位,代表属组的权限,-是无权限,r是读权限,w是写权限,x是可执行权限

第四部分:第8、9、10位,代表其他用户的权限(即除了root和属主之外的用户权限),-是无权限,r是读权限,w是写权限,x是可执行权限

​ 另外,ROOT用户的权限户高于所有,不受到任何权限属性的限制。

数字定义权限

权限所对应的数字如下表展示:

权限 数字
r 4
w 2
x 1

​ 如果一个文件的权限是754,则该文件权限代表信息如下:

属主:所有权限,4+2+1=1

属组:读和执行权限:4+1=5

其他用户:仅有读权限:4

权限相关体现

​ 对于一个文件的权限来说有以下几种情况:

  1. 如果可读则意味着能够对其进行打开
  2. 如果可写则意味着能够对其内容进行变更
  3. 如果可执行则意味着能够使用sh或./命令对其进行运行

​ 对于一个目录的权限来说有以下几种情况:

  1. 如果可读则意味着能够查看该目录下的内容
  2. 如果可写则意味着能够对该目录下的内容进行变更,如新建、删除、重命名等操作,但仅限制子代,对超子代不进行限制
  3. 如果可执行则意味着能够cd进该目录

更改权限命令

​ 更改文件、目录的命令为chmod,修改方法有以下3种:

在原有权限属性的基础上对其进行+或者-的操作

使用=选项清除原有权限并赋予新权限

配合数字权限,快速变更项目权限

​ 除此之外,由于权限包含属主,属组,以及其他用户,总体来说有4大类别,如下所示:

u代表属主权限

g代表属组权限

o代表其他用户权限

a代表全部的权限,包含属主、属组、其他用户

​ 示例演示:

# 取消所有权限
T > chmod uga= test
T > ls -l test
----------. 1 root root 0 Jan 30 05:19 test

# 取消所有权限
T > chmod a= test
T > ls -l test
----------. 1 root root 0 Jan 30 05:19 test

# 增加所有权限
T > chmod a=rwx test
T > ls -l test
-rwxrwxrwx. 1 root root 0 Jan 30 05:19 test

# 取消属组的所有权限
T > chmod g= test
T > ls -l test
-rwx---rwx. 1 root root 0 Jan 30 05:19 test

# 取消用户的所有权限
T > chmod u= test
T > ls -l test
-------rwx. 1 root root 0 Jan 30 05:19 test

# 给属组增加所有权限
T > chmod g=rwx test
T > ls -l test
----rwxrwx. 1 root root 0 Jan 30 05:19 test

# 修改属组的权限只有r
T > chmod g=r test
T > ls -l test
----r--rwx. 1 root root 0 Jan 30 05:19 test

# 修改属组的权限在原有基础上增加w
T > chmod g+w test
T > ls -l test
----rw-rwx. 1 root root 0 Jan 30 05:19 test

# 修改属组的权限在原有基础上减少w
T > chmod g-r test
T > ls -l test
----r--rwx. 1 root root 0 Jan 30 05:19 test

# 修改其他用户的权限在原有基础上减少x
T > chmod o-x test
T > ls -l test
----r--r-x. 1 root root 0 Jan 30 05:19 test

# 使用数字权限(推荐)
T > chmod 775 test
T > ls -l test
-rwxrwxr-x. 1 root root 0 Jan 30 05:19 test

更改属主属组

​ 我们既然可以创建一个文件,当然也可将其送给别人。

​ 更改属主、属组的命令为chown,修改方法有以下3种:

仅修改属主,直接输入属主名字
仅修改属组,在属组名字前加上:
同时修改属主与属组,先写属主名,在写:加上属组名

​ 示例演示:

T > ls -l
-rwxrwxr-x. 1 root root 0 3月   1 13:58 test

# 仅修改属主
T > chown ken ./test
T > ls -l
-rwxrwxr-x. 1 ken root 0 3月   1 13:58 te

# 仅修改属组
T > chown :ken ./test
T > ls -l
-rwxrwxr-x. 1 ken ken 0 3月   1 13:58 test

# 同时修改属主和属组
T > chown root:root ./test
T > ls -l
-rwxrwxr-x. 1 root root 0 3月   1 13:58 test

归档压缩篇

压缩与归档

​ 压缩与归档还是有相当大区别的,如下所示:

压缩:仅能对文件进行处理,不能对目录进行处理,通过算法最大保留文件信息且让文件体积变小利于传输

归档:俗称为打包,是一个文件或者目录的集合,内部项目并不会进行压缩

​ 一般来说,如果我们想将一个体积很大且包含多个子目录、子文件的项目进行网络传输时,会先将该项目进行压缩和打包后再进行发送,这样可以减少项目体积节省传输带宽。

​ 使用图来看懂压缩和归档的区别:

-- 主目录
	-- 文件1 10kb
	-- 文件2 20kb
	-- 目录1 50kb
		-- ...

# 只进行打包后
-- 一个集合(80kb)

# 先进行压缩后进行打包
-- 一个集合 (40kb)

gzip

gzipLinux下对文件压缩的一种算法,使用方法如下:

gzip 被压缩文件
# 注意:被压缩后的文件都会自动带上后缀.gz

gunzip 被解压的gz类型文件

​ 示例演示:

T > echo 'Hello,Linux' > newFile.txt

# 压缩
T > gzip newFile.txt
# 解压
T > gunzip newFile.txt.gz

bzip2

bzip2Linux下另一种文件压缩的算法,相比于gzip来说使用相对较少,使用方法如下:

bzip2 被压缩文件
# 注意:被压缩后的文件都会自动带上后缀.bz2

bunzip2 被解压的bz2类型文件

​ 示例演示:

T > echo 'Hello,Linux' > newFile.txt

# 压缩
[root@localhost ~]# bzip2 newFile.txt 

# 解压
[root@localhost ~]# bunzip2 newFile.txt.bz2 

tar

​ 上面已经说过了,压缩操作不能压缩目录仅能压缩单个文件,而打包操作可以将多个文件进行集合。

​ 所以我们可以对一个目录进行tar命令快速压缩并打包的操作,具体参数如下所示:

参数 描述
c 新建打包文件
z 以gzip方式进行压缩并打包
j 以bzip2方式进行压缩并打包
x 解包
-C 指定解包路径
v 显示打包或解包详细过程

​ 使用格式如下:

# 压缩并打包,算法:gzip
tar zcvf [压缩并打包后的包名.tar.gz] [将要压缩并打包的项目名]

# 解包并解压,算法:gzip
tar zxvf [包名.tar.gz] -C [解包后的存放路径]

# 压缩并打包,算法:bzip2
tar jcvf [压缩并打包后的包名.tar.bz2] [将要压缩并打包的项目名]

# 解包并解压,算法:bzip2
tar jxvf [包名.tar.bz2] -C [解包后的存放路径]

# 注意,如果不在解压时指定算法,则会自动识别算法进行解压

​ 在后续安装软件时,将会采用这种方式进行安装。

进程相关篇

进程名词

​ 在Linux中一切皆文件,对于进程而言就是一些正在运行状态中的文件。

文件本身躺在硬盘中是死的,但是当被加载到内存中从而让`CPU`进行调用的时候就活了过来,因此可以理解为当前正在被`CPU`调用的文件就是一个进程。

​ 在Linux中,有以下一些进程相关的名词:

父进程:当程序A运行过程中调用了程序B,程序A可称为程序B的父进程

子进程:当程序A运行过程中调用了程序B,程序B可称为程序A的子进程

守护进程:当程序A运行过程中调用了程序B,而当程序A运行完毕后程序B也被强制关闭,程序B可称为守护进程

僵尸进程:当程序A运行完毕后并未释放所有资源,如进程编号等未被释放,此时的程序A将可以被称为僵尸进程

中断信息:中断信息用于控制进程的运行

查看进程

​ 使用ps aux命令配合| head -5来查看当前操作系统中所有进程及相信信息:

T > ps aux | head -5

USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.6 128092  6728 ?        Ss   09:39   0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root          2  0.0  0.0      0     0 ?        S    09:39   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    09:39   0:00 [ksoftirqd/0]
root          6  0.0  0.0      0     0 ?        S    09:39   0:00 [kworker/u256:0]

​ 上述命令结果描述如下:

USER    PID         %CPU          %MEM    VSZ       RSS    TTY           STAT
用户名 进程ID  进程占CPU百分比 进程占内存百分比 虚拟内存  物理内存 在哪个终端运行  当前状态

START      TIME    COMMAND
开始时间 运行时间    产生该进程的文件

​ 也可使用pstree命令来查看进程树,不过由于我们是最小安装,所以使用不了该命令,先使用yum进行安装:

T > yum install psmisc -y

​ 然后即可以使用该命令了:

T > pstree

后台进程

​ 运行一段脚本就是打开一个进程,使用&将打开的进程挂在后台中:

T > 进程名 &

# 会显示的内容
# 工作号 进程号

​ 使用jobs命令查看该终端下打开的子进程:

T > jobs

​ 使用以下命令可将后台进程与前台进程之间相互转换:

# 后台转前台
T > fg %子进程工作号

# 前台转后台
T > bg %子进程工作号

结束进程

​ 结束进程的命令有两个:

命令 描述
kill -9 进程号 根据进程号强制结束某一个进程
pkill -9 进程名 根据进程名强制结束某一些进程,可使用模糊匹配,如my*

系统相关篇

启动流程

CentOS6示例:

image-20210301215820035

CentOS7示例:

img

任务管理器

​ 使用top命令可实时监控系统信息,如下所示,节选:

top - 17:11:24 up  7:31,  2 users,  load average: 0.05, 0.03, 0.05
Tasks: 105 total,   1 running, 104 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   999936 total,   245624 free,   157640 used,   596672 buff/cache
KiB Swap:  1257468 total,  1257468 free,        0 used.   631536 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 29963 root      20   0  157576   2160   1532 R  0.3  0.2   0:00.01 top
     1 root      20   0  128092   6728   3968 S  0.0  0.7   0:01.81 systemd
     2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd
     3 root      20   0       0      0      0 S  0.0  0.0   0:00.31 ksoftirqd/0
     6 root      20   0       0      0      0 S  0.0  0.0   0:00.35 kworker/u256:0
     7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0

任务管理器描述如下:

----------------------------------基础信息---------------------------------------
top - 17:11:24   up  7:31,      2 users,       load average: 0.05, 0.03, 0.05
   当前系统时间 本次开机时长  系统登录用户     CPU平均负载

----------------------------------进程信息---------------------------------------
Tasks: 105 total,     1 running, 104 sleeping, 0 stopped,   0 zombie
        任务总数       正在运行     睡眠进程     暂停进程    僵尸进程

----------------------------------CPU信息(按1可显示详细信息)----------------------
%Cpu(s):  0.0 us,            0.0 sy,            0.0 ni,           100.0 id,
         用户进程占比      系统进程占比       保存值占比        剩余值占比
          0.0 wa,            0.0 hi,            0.0 si,            0.0 st
        输入输出操作占比   硬件中断占比       软件中断占比      CPU被其他虚拟机所占用的百分比

----------------------------------物理内存信息-------------------------------------
KiB Mem : 999936 total,   245624 free,   157640 used,   596672 buff/cache
           总物理内存      剩余内存        被使用内存     内存缓冲区

----------------------------------虚拟内存信息-------------------------------------
KiB Swap:  1257468 total,  1257468 free,      0 used.   631536 avail Mem
           总虚拟内存      剩余内存          被使用内存  可使用内存

----------------------------------进程相关信息-------------------------------------
  PID    USER        PR       NI      VIRT          RES
  进程号 用户       优先值  排后值  虚拟内存占用  物理内存占用

  SHR S                           %CPU               %MEM                TIME+         COMMAND
  共享内存运行状态s停止,r运行  进程占用CPU百分比  进程占用内存百分比  进程运行时长   进程描述信息

内存管理器

​ 使用free -m命令可实时监控系统信息,如下所示,节选:

T > free -m

              total        used        free      shared  buff/cache   available
Mem:            976         153         239           6         582         616
Swap:          1227           0        1227

# 命令选项
# -m 以MB为单位
# -h 以GB为单位

​ 内存管理器描述如下:

              总内存        已使用内存   剩余内存      共享内存   高速缓冲区    可用内存
物理内存:         976           153       239           6         582         616
虚拟内存:         1227           0        1227

文件管理器

​ 使用df -h命令可实时监控所有已挂载的磁盘、媒体硬件的信息,如下所示,节选:

T > df -h

文件系统             容量  已用  可用 已用% 挂载点
/dev/mapper/cl-root   11G  1.9G  8.7G   19% /
devtmpfs             501M     0  501M    0% /dev
tmpfs                512M     0  512M    0% /dev/shm
tmpfs                512M  7.1M  505M    2% /run
tmpfs                512M     0  512M    0% /sys/fs/cgroup
/dev/sda1            1.1G  146M  919M   14% /boot
tmpfs                103M     0  103M    0% /run/user/1000
tmpfs                103M     0  103M    0% /run/user/0

# 命令选项
# -m 以MB为单位
# -h 以GB为单位

系统服务

systemctl命令在新版CentOS中已经全面替代了service命令,使用它可快速的对系统服务进行管理,以下是一些常用命令:

命令 描述
systemctl enable 服务名.service 开机启动某一服务
systemctl disable 服务名.service 关闭开机启动某一服务
systemctl start 服务名.service 开启某一服务
systemctl restart 服务名.service 重启某一服务
systemctl stop 服务名.service 关闭某一服务
systemctl status 服务名.service 查看某一服务运行状态

​ 如果你想将某一软件服务制作为系统服务,则需要编写unit脚本,具体编写方法参见博客:点我跳转
​ 编写完unit脚本后,将脚本丢到下方即可使用systemctl对服务进行管理。

/etc/systemd/system/
/usr/lib/systemd/system

文件系统篇

扇区与block块

​ 对于磁盘来说,一次能够读写的大小操作操作系统规定最小要达到一个扇区的大小,即

512Bytes,而操作系统为了避免频繁的同磁盘打交道往往会攒够8个扇区的数据量再进行写入或读取操作,8个扇区因此也被称之为block块。

磁盘分区

​ 我们在VM虚拟机中为系统增加一块5G的磁盘。

image-20210301235655363

​ 此时我们可以立即看到新增磁盘的名字,名为sdb

[root@localhost ~]# ls /dev | grep sd
sda
sda1
sda2
sdb

​ 首先第一步我们要使用fdisk命令对其进行分区,通过fdisk -l /dev/sdb可以查看该硬盘详细信息:

T >  fdisk -l /dev/sdb

磁盘 /dev/sdb:5368 MB, 5368709120 字节,10485760 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

​ 通过命令fdisk /dev/sdb来为该磁盘进行分区。

​ 主分区在MBR中最多存在4个。

​ 扩展分区最多15个,扩展分区无法直接使用,需要在扩展分区下创建逻辑分区。

​ 下面我们直接创建主分区,在命令中有以下一些常用选项:

命令 描述
n 下一步
p 查看详情
d 删除某个分区(按照编号删除)
w 进行应用(fdisk所有操作先存储在内存中,直至你输入了w再进行应用)
q 退出

以下是分区演示,创建了1个主分区:

T > fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0xe94fb16b 创建新的 DOS 磁盘标签。

# n 下一步
命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
   
# p主分区,e扩展分区  
Select (default p): p  
分区号 (1-4,默认 1):1
起始 扇区 (2048-10485759,默认为 2048):2048
Last 扇区, +扇区 or +size{K,M,G} (2048-10485759,默认为 10485759):
将使用默认值 10485759
分区 1 已设置为 Linux 类型,大小设为 5 GiB

# w写入
命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。

现在,我们已经成功创建了1个主分区了:

[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。


命令(输入 m 获取帮助):p

磁盘 /dev/sdb:5368 MB, 5368709120 字节,10485760 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xe94fb16b

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10485759     5241856   83  Linux

​ 最后一步,进行更新,保存分区内容:

T > partprobe

​ 再次查看/dev下的内容:

T > ls /dev | grep sd
sda
sda1
sda2
sdb
sdb1

格式化

​ 磁盘分区完成后,需要对其进行格式化才能正常使用。

​ 输入命令mkfs.并按下回车查看当前CentOS版本支持的格式化文件系统:

T > mkfs.
mkfs.btrfs   mkfs.cramfs  mkfs.ext2    mkfs.ext3    mkfs.ext4    mkfs.minix   mkfs.xfs

​ 我们决定采用xfs的格式来进行分区,这种格式对比ext4拥有更多的有点:

T > mkfs.xfs /dev/sdb1

​ 由于我们只创建了一个主分区,所以可以直接进行格式化操作,如果是扩展分区则不可以,需要对扩展分区下的逻辑分区才能操作成功。

挂载目录

​ 在分区和格式化完成之后,sdb2目前属于b类型文件,即硬件设备,并不能直接使用。

​ 因此需要对其进行一个映射操作,这个映射操作则被称为挂载。

​ 说的通俗一点,1个目录对应1个b文件,类似于Windows下的分区于盘符的关系。

​ 我们创建一个目录,用于稍后的挂载操作:

T > mkdir /usr/local/application

​ 使用mount命令进行挂载:

T > mount /dev/sdb1 /usr/local/application

​ 挂载完成之后,即可使用df -h命令来进行文件管理的查看:

T > df -h | tail -1
/dev/sdb1            5.0G   33M  5.0G    1% /usr/local/application

文件系统

​ 目前我们挂载的文件夹是空的,但是上面的操作中可以看到它有已使用的部分。

​ 使用mount命令,可查看其详细信息:

T > mount | tail -1
/dev/sdb1 on /usr/local/application type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

​ 对于一个文件来说,即使该文件是内容是空白的,它依然会占据一些空间。

​ 一个新建的文件,除开其本身存储的内容之外还具有文件名 - 权限 - 硬链接数量 - 属主 - 属组 - 大小 - 创建时间 等信息,我们统一把这些信息称为元数据。这些内容都是要占用空间的,那么元数据是存放在哪里的呢?

​ 前面讲过bolck块的概念,一个分区的bolck块叫做数据bolck块,专门存放文件的数据,还有一个inoode块,就是专门来存放文件元数据的,存储在innode中的元数据也被称为i节点信息。

​ 硬盘只要格式化成文件系统之后都会被分成两部分,如下图所示:

image-20210201112715747

使用命令,df -i可查看每个分区的i节点信息:

T > df -i | tail -1
文件系统     Inode   已用(I)   可用(I)    已用(I)%  挂载点
/dev/sdb1  2620928    3     2620925      1%      /usr/local/application

​ 其实,在硬盘中存放一个文件的时候,都会给这个文件提供i节点进行存储元信息,如果是一个空文件,它虽然内容不占block大小但是还是占用innode大小。所以如果innode块被占满了那么磁盘也就被沾满了。

​ 把磁盘比喻成一个考室,一个位置相当于一个innode编号,如果这个考室座位上没有一个人,但是都有其专属考生的编号,那么这个考室就无法安排其他考生入内了。

​ 这种情况映射到硬盘上就是说硬盘空间还有很多,但是innode号不够用了,磁盘也就满了。

​ 使用ls -li 名字来查看一个文件和目录的编号:

# 查看文件的innode编号
T > ls -li /etc/passwd
8732814 -rw-r--r--. 1 root root 1174 3月   1 13:49 /etc/passwd

# 查看目录的innode编号
T > ls -li / | grep etc
8388673 drwxr-xr-x.  82 root root 8192 3月   1 23:57 etc

​ 每个innode块有两部分。分为innode编号和元信息,他们都是使用指针来指向同一个文件。

image-20210201114223916

directory block就是目录块,目录的地址。当一个文件被存储进block块,会执行以下流程:

image-20210201114320659

软硬链接

​ 软链接与硬连接的常见方式如下表所示:

命令 描述
ln -s 被链接的源文件 链接投放地点 建立软链接
ln 被链接的源文件 链接投放地点 建立硬链接

​ 软链接在Linux下非常常用,类似于Windows下的快捷方式,其特点如下:

  1. 软链接或者源文件内容有任何改变,都会影响到对方

  2. 删除源文件,软链接将会失效,删除软链接,源文件不变

  3. 软链接与源文件的innode号不一样

  4. 软链接指向源文件名词

  5. 软链接可以跨分区

​ 硬链接使用较少,特点如下:

  1. 硬链接或者源文件内容有任何改变,都不会影响到对方

  2. 删除源文件,硬链接不会失效,删除硬链接,源文件不会改变

  3. 硬链接是指向源文件的innode号的

  4. 硬链接无法跨分区

网络管理篇

基本介绍

​ 根据TCP/IP协议。连接在Internet上的计算机每一个都要有一个IP地址,IP地址由八位二进制数构成,用十进制验算则是四个0-255之间的数字。

IP地址分为网络地址和主机地址两部分,网络地址就是用来标识采用此IP的计算机处于哪个子网,主机地址用来标识处于具体的那一个位置,单纯的IP地址是看不出子网的,必须要通过掩码。如后面加上/16,那么就表明这段IP的前16位代表网络位,后16位代表主机位,如果要写一个IP地址的网络地址那么只需要将前面网络位的数字写出来就好,主机位全部置0,而主机地址就是本身。比如:

img

​ 将IP地址中的网络位和主机位固定下来,IP地址被分成了不同的类集,被分成了A,B,C,D,E类:

​ 常见的三类:

A类地址:前8位都是网络位,后面24位是主机位。1 - 126(掐头去尾)

B类地址:前16位都是网络位,后16位是主机位。128 - 191(掐头去尾)

C类地址:前24位都是网络位,后8位是主机位。192 - 223(掐头去尾)

​ 不常见的两类:

D类地址:通常用于广播,多播。224 - 239

E类地址:保留地址,240 - 255

IP地址可以用子网掩码来实现多层隔离,通过借位的方式可以让一类地址细化分成更多的广播域,用来阻止网络风暴的发生。

# 使用IP地址来算子网地址。比如:192.167.45.1/24,采用异或运算
b ‘11000000.10100111.00101101.00000001
b ’11111111.11111111.11111111.00000000
b ‘11000000.10100111.00101101.00000000 

​ 这个就是子网划分出的地址。192.167.45.0 ,只有网络地址一样,才能进行内部广播通信。

虚拟机网络

​ 在VM中,虚拟机拥有以下三种网络:

image-20210301112023040

​ Bridged(桥接模式):通过虚拟网桥进行通信和联网,不需要虚拟网卡来使虚拟机和物理机通信。使用桥接模式,虚拟机IP地址需和物理层面上的客户机处于同一网段。通过物理交换机链接Internet

NAT(网络地址转换)模式:`NAT`模式的虚拟机和物理机的IP地址不能处于同一网段。因为要将虚拟机的`IP`地址转换为物理机的网关所在`IP`地址然后再进行发包链接。`NAT`在计算机网络中是很常见的一种模式.

​ Host-Only(仅主机模式):实验用的,如果使用仅主机模式。那么虚拟机A与虚拟机B使用同一网段,将会实现通信发包。

链接网络

​ 我们准备使用桥接模式来让虚拟机获取网络服务,因此需要先查看物理机的IP地址,物理机是Mac所以打开终端输入ifconfig获取物理机IP地址:

T > ifconfig

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	options=6b<RXCSUM,TXCSUM,VLAN_HWTAGGING,TSO4,TSO6>
	ether b0:25:aa:17:c0:c4
	inet6 fe80::146f:4dee:7774:f6e0%en0 prefixlen 64 secured scopeid 0x7
	inet 192.168.1.102 netmask 0xffffff00 broadcast 192.168.1.255
	nd6 options=201<PERFORMNUD,DAD>
	media: autoselect (100baseTX <full-duplex>)
	status: active

​ 接下来是打开VM中的网络配置,如下所示:

image-20210301122330029

​ 然后我们要为虚拟机配置网络地址,由于是桥接模式,所以与物理机在同一网段下即可:

T > vim /etc/sysconfig/network-scripts/ifcfg-网卡名

# 一般来说网卡名都ens33,ens36等,不同系统下命名方式也不一样

​ 填入以下配置信息:

TYPE=Ethernet  		# 类型
BOOTPROTO=static 	# 由dhcp改为static
DEFROUTE=yes	 	
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=ens36				# 网卡名称
UUID=bf5337ab-c044-4af7-9143-12da0d493b89
DEVICE=ens36			# 和名称相同
PEERDNS=yes
PEERROUTES=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
ONBOOT=yes 			    # 修改成 yes
IPADDR=192.168.1.120    # Linux的IP地址,与物理机相同网段
NETMASK=255.255.255.0   #  子网掩码,与物理机相同
GATEWAY=192.168.1.1     #  默认网关,与物理机相同
DNS1=114.114.114.114	# DNS域名解析服务器地址	   

​ 填完配置信息之后,重启网络服务:

T > systemctl restart network

# centos8采用新命令
nmcil c reload

​ 虚拟机中使用ifconfig命令,查看是否配置成功:

T > ifconfig

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
	inet 192.168.1.120 netmask 255.255.255.0 broadcast 192.168.1.255
	inet6 fe80::cd1e:8c81:edfb:11d8 prefixlen 64 secured scopeid 0x20<link>
	...

​ 尝试进行ping命令对百度进行请求:

T > ping www.baidu.com

其他配置

​ 查看与临时修改主机名称:

# 如果不填新名字,则为查看当前主机名称
T > hostname 新名字

​ 网络服务的守护进程进行开关:

# 关闭网络服务开机启动
T > systemctl disable NetworkManager

# 打开网络服务开机启动
T > systemctl enable NetworkManager

# Centos7中,有两个网络服务,所以我们禁用掉这一个

​ 开启关闭网卡:

# 立即启用网卡
T > ifup 网卡名 

# 立即关闭网卡
T > ifdown 网卡名  

​ 查看网络安全组配置:

T > route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 ens33
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens33

# 第一行为网络出口配置
# 第二行开始为网络入口配置,即那些网段的地址可以访问该机

​ 临时的添加网关:

# 临时添加网关
T > route add gw 网关ip

# 临时添加默认网关
T > route add default 网关ip

​ 永久修改DNS域名解析服务器地址:

T > vim /etc/resolv.conf

​ 永久修改本地HOSTS文件:

T > vim /etc/hosts

​ 防火墙相关配置:

# 关闭防火墙
T > systemctl stop firewalld

# 开机不启动
T > systemctl disable  firewalld

软件服务篇

wget使用介绍

wget类似于下载器的功能,能对一个链接的资源进行下载。

​ 由于我们的安装方式是选择的最小安装,所以需要先对wget命令进行安装:

T > yum install wget -y

​ 下面示例中将使用wget命令下载Python3.6.8Source版本:

T > wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz

tar.gz与编译安装

tar.gz安装包是最常见的,也是互联网上使用最多的安装包版本。

​ 对tar.gz安装包进行细分,可分为需要编译安装的源码版本Source与免编译安装的版本Binary

​ 为什么叫编译安装呢? 因为在计算机的内部执行的都是1和0这两个数字,所以所有的执行命令,其实都是在内存中经过字符编码转换为二进制数实现的,在转换过程中进行安装即被称为编译安装。

​ 关于Binary免编译版的安装包使用方式及其简单,只需要进行普通的tar解压操作即可,如下所示:

tar xvf [Binary安装包路径] -C [解压路径]

​ 当解压完成之后立即使用即可。

​ 而对于需要编译的Source源码版本,这里也进行一下演示,我们将会对上面wget下载下来的Python3.6.8进行编译安装。

​ 第一步,需要对其归档文件进行解包操作,先解压到当前目录中。

T > tar xvf Python-3.6.8.tgz -C ./
T > ls
anaconda-ks.cfg  Python-3.6.8  Python-3.6.8.tgz

​ 第二步,对于编译安装来说需要gcc工具,所以要提前装好:

T > yum install gcc gcc-c++ -y

​ 第三步,进入Python-3.6.8的文件夹,进行编译安装的过程:

T > cd Python-3.6.8

# 执行configure脚本,添加编译参数,如安装到那个目录下
T > ./configure --prefix=/usr/local/Python36

# 使用make命令进行编译
T > make

# 使用make install 进行编译安装
T > make install

​ 第四步,经过漫长的等待,我们终于安装好了Python3.6.8,现在进行操作看一下:

T > /usr/local/Python36/bin/python3
Python 3.6.8 (default, Mar  1 2021, 22:39:30)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

​ 好了,以上就是编译安装的全过程,使用exit()命令即可退出Python解释器环境。

​ 现在其实剩下的安装包以及解压后的文件都没有了,对其进行删除即可:

T > cd ..
T > rm -rf Python-3*

​ 以后若想卸载Python3.6.8,只需要删除它的安装目录即可:

T > rm -rf /usr/local/Python36

rpm与相关命令

rpm安装包最早由红帽公司推出。与tag.gzSouce版本安装包最大的不同在于其本身已经是被编译好了的二进制,所以安装起来会省去字符编码转换的过程,CentOS官方已经帮忙编译了很多tag.gz的安装包为rpm格式。但是操作系统的开发商不会时时刻刻对这些软件进行升级和更新。

​ 如果想使用最新的最全面的软件体验,那么请使用tag.gz后缀的安装包。

​ 以下是rpm软件包管理的相关命令:

命令 描述
rpm -ivh 包名或链接 安装rpm软件包,-h查看哈希值,-v查看详情,注意安装本地包时必须cd进对应目录
rpm -ivh 包名或链接 --force 强制安装rpm软件包,即使该软件已被安装,注意安装本地包时必须cd进对应目录
rpm -aq 查看所有已安装的rpm软件
rpm -q 软件名 查看某个软件是否已经安装
rpm -ql 软件名 查看某个软件的安装位置
rpm -qi 软件名 查看某个软件的安装详情
rpm -e 软件名 对已安装的某一软件进行卸载,可能会提示卸载后将会出现依赖问题
rpm -e 软件名 对已安装的某一软件进行强制卸载,不会提示卸载后将会出现依赖问题

rpm可以安装本地的安装包,也可以安装网络上的安装包。

​ 我们先来看本地的安装包如何进行加载,首先打开VM虚拟机,挂载含有rpm安装包的CentOS7.3.ISO的安装光盘,由于我们是最小安装,所以要手动对光盘进行挂载操作,命令如下:

T > ls /dev | grep ^sr
# 由于光盘文件是以sr开头,所以我们找到它即可

T > mount /dev/sr0 /media

mount: /dev/sr0 写保护,将以只读方式挂载
mount:/dev/sr0 已经挂载到 /media 上

​ 现在使用df -h命令,即可查看到该光盘挂载目录:

T > df -h

文件系统             容量  已用  可用 已用% 挂载点
/dev/mapper/cl-root  9.8G  2.0G  7.9G   20% /
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  139M  876M   14% /boot
tmpfs                 98M     0   98M    0% /run/user/1000
tmpfs                 98M     0   98M    0% /run/user/0
/dev/sr0             4.1G  4.1G     0  100% /media

​ 此光盘中的Packages目录下包含大量rpm软件包。如下所示:

T > ls /media/Packages/ | head -5

389-ds-base-1.3.5.10-11.el7.x86_64.rpm
389-ds-base-libs-1.3.5.10-11.el7.x86_64.rpm
abattis-cantarell-fonts-0.0.16-3.el7.noarch.rpm
abrt-2.1.11-45.el7.centos.x86_64.rpm
abrt-addon-ccpp-2.1.11-45.el7.centos.x86_64.rpm

​ 以下是一些对rpm软件包软件名的解读,倒着看会比较清晰:

第1段是软件包的名称

第2段是软件版本编号

第3段软件包的修正次数

第4段代表支持的平台

第5段代表CPU架构

最后一部分就是文件扩展名

软件包版本号如果最后一位是奇数的话,那么就表明这个软件还处于测试阶段,可能有一些BUG等不确定因素,不具有稳定性,反之偶数就是稳定版。

​ 如果本地的rpm软件包不够你用的话,你也可以在CentOS官网进行查找并安装。

​ 首先查看系统自身编号:

T > cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

​ 然后进入官网mirror.centos.org

image-20210201193305569

​ 复制出链接直接安装即可。

yum与相关命令

yum会自动安装rpm软件,并且会自动安装其依赖软件,是在CentOS下最为推荐的一种安装软件的方式。

​ 但是yum的下载源可能存在速度较慢的问题,所以我们在后面会对yum源进行调整。

yum的基本命令如下:

命令 描述
yum install 软件名 -y 安装某个软件, 使用 -y 来让所有选项都确定
yum remove 软件名 卸载某个已安装的软件
yum reinstall 软件名 更新某个已安装的软件
yum makecache 创建缓存文件,有效提升网络安装的速度
yum clean all 清理缓存
yum groupulist 批量安装成批工具,如yum groupulist '开发者工具'
yum update -y 更新yum源

​ 配置基于网络仓库下载的rpm软件包存放路径及缓存计划:

T > vim /etc/yum.conf

[main]
cachedir=/var/cache/yum/$basearch/$releasever    # 缓存路径
keepcache=0  # 是否自动清理缓存?0不清理,1清理

# $contentdir --> 系统版本,如centos-7
# $releasever --> 详细版本,如7
# $basearch   --> 平台架构,如x86_64

yum分为本地仓库和远程仓库。

​ 首先来查看所有的yum仓库:

T > ls /etc/yum.repos.d/
CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Media.repo    CentOS-Vault.repo
CentOS-CR.repo    CentOS-fasttrack.repo  CentOS-Sources.repo

​ 接下来我们自己来配置一个本地的yum仓库,使其链接到sr0挂载目录中:

T > vim /etc/yum.repos.d/local.repo

# file路径必须//开头跟上路径
[local]
name=local yum
baseurl=file:///media/
enabled=1
gpgcheck=0

​ 现在,当我们使用yum进行安装软件时,会首先查找本地的软件包。

​ 那么这里你可能有一个疑问,为何只挂载到/media目录下,而未挂载到位于软件包真正存放位置的/media/Packages目录下呢?

​ 其实,yum除开安装rpm软件包外,还有一个功能就是查找其所需要的依赖环境并进行自动安装。

​ 在yum安装rpm软件包及其依赖时,会按照下图中的流程进行查找:

image-20210301232215318

​ 通过观察上图,我们可以发现它会去找的两个重要目录就是repodataPackages,我们再接着查看/media目录中是否有这两个子目录:

T > ls /media | grep repodata
repodata

T > ls /media | grep Packages
Packages

​ 现在上图中为何在创建本地仓库时只将查找路径配置为/media相信你已经明了了。

SSH服务篇

基本介绍

​ 我们知道,对于服务器来说一般都是存在远端。当服务器发生异常之后我们需要使用一款软件对其服务器进行远程操控排除异常,那么在Linux中都自带了这样的一款软件,名为ssh

​ 这是一款C/S架构软件,Linux系统拥有它的Client端和Server端,使用如下命令可查看到ssh服务依赖的安装程序:

T > rpm -qa | grep 'openssh'
openssh-server-6.6.1p1-31.el7.x86_64
openssh-clients-6.6.1p1-31.el7.x86_64
openssh-6.6.1p1-31.el7.x86_64

​ 查看sshd(服务端)运行状态,服务端默认端口号为22:

T > systemctl status sshd.service | grep active

Active: active (running) since 一 2021-03-01 23:57:16 CST; 33min ago

​ 使用ssh(客户端)命令来连接服务端,以下示例中是我的Mac连接虚拟机Centos7.3

T > ssh -p22 root@192.168.1.120

工作机制

​ 服务器启动的时候自己产生一个密钥(768bit公钥),本地的ssh客户端发送连接请求到ssh服务器,服务器检查连接点客户端发送的数据和IP地址,确认合法后发送密钥(768bits)给客户端,此时客户端将本地私钥(256bit)和服务器的公钥(768bit)结合成密钥对key(1024bit),发回给服务器端,建立连接通过key-pair数据传输。

image-20210302003705334

客户端主动联机请求

​ 若客户端想要联机到 ssh 服务器,则需要使用适当的客户端程序来联机,包括 ssh, putty 等客户端程序连接。

服务器传送公钥给客户端

​ 接收到客户端的要求后,服务器便将第一个步骤取得的公钥传送给客户端使用 (此时应是明码传送,反正公钥本来就是给大家使用的)。

客户端记录并比对服务器的公钥数据及随机计算自己的公私钥

​ 若客户端第一次连接到此服务器,则会将服务器的公钥记录到客户端的用户家目录内的 ~/.ssh/known_hosts 。若是已经记录过该服务器的公钥,则客户端会去比对此次接收到的与之前的记录是否有差异。若接受此公钥, 则开始计算客户端自己的公私钥。

回传客户端的公钥到服务器端

​ 用户将自己的公钥传送给服务器。此时服务器:具有服务器的私钥与客户端的公钥,而客户端则是: 具有服务器的公钥以及客户端自己的私钥,你会看到,在此次联机的服务器与客户端的密钥系统 (公钥+私钥) 并不一样,所以才称为非对称加密系统。

开始双向加解密

​ (1)服务器到客户端:服务器传送数据时,拿用户的公钥加密后送出。客户端接收后,用自己的私钥解密

​ (2)客户端到服务器:客户端传送数据时,拿服务器的公钥加密后送出。服务器接收后,用服务器的私钥解密,这样就能保证通信安全。

服务端配置

​ 使用vim/etc/ssh/sshd_config文件进行配置,如你可以关闭UserDns选项使ssh链接更加迅速:

T > vim /etc/ssh/sshd_config

#UseDNS yes
UseDns no

scp文件传输

scp命令会基于SSH进行文件的上传或下载,使用格式如下:

命令 描述
scp -r [本地文件路径] [用户名]@[地址]:[上传的路径] 上传后保存的路径及名字
scp -r [用户名]@[地址]:[下载的路径] [本地存储路径] 下载后保存的路径及名字

系统优化篇

开发者工具

​ 开发者工具里的很多软件都会被我们经常使用,如git,所以使用Linux第一件事就是按照开发者工具:

T > yum -y groupinstall "Development tools"
T > yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel

​ 当按照完成后,输入git应该会弹出提示信息:

T > git

规范主机名

​ 使用规范的主机名,后面会有很多服务可能会依赖你的主机名,所以应当写一个便于记忆的主机名:

T > hostnamectl set-hostname 主机名

配置yum源

​ 默认的yum源是在国外,速度可能比较慢,所以我们需要对其进行配置:

# 备份
T > mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

# 下载新的CentOS-Base.repo 到/etc/yum.repos.d/
T > curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

# 添加新源
T > curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

# 然后执行yum update -y,进行更新
T > yum update -y  

# 安装常用软件包,然后执行部署,将部署过程中安装的包缓存本地
T > yum -y install tree nmap sysstat lrzsz  telnet bash-completion bash-completion-extras vim lsof  net-tools rsync ntpdate nfs-utils

关闭无用启动项

​ 关闭以下无用启动项:

systemctl disable abrt-ccpp.service
systemctl disable abrt-oops.service
systemctl disable abrt-vmcore.service
systemctl disable abrt-xorg.service
systemctl disable abrtd.service
systemctl disable accounts-daemon.service
systemctl disable atd.service
systemctl disable auditd.service
systemctl disable autovt@.service
systemctl disable avahi-daemon.service
systemctl disable bluetooth.service
systemctl disable cups.service
systemctl disable dbus-org.bluez.service
systemctl disable dbus-org.fedoraproject.FirewallD1.service
systemctl disable dbus-org.freedesktop.Avahi.service
systemctl disable dbus-org.freedesktop.ModemManager1.service
systemctl disable dbus-org.freedesktop.NetworkManager.service
systemctl disable dbus-org.freedesktop.nm-dispatcher.service
systemctl disable display-manager.service
systemctl disable dmraid-activation.service
systemctl disable firewalld.service
systemctl disable gdm.service
systemctl disable irqbalance.service
systemctl disable iscsi.service
systemctl disable ksm.service
systemctl disable ksmtuned.service
systemctl disable libstoragemgmt.service
systemctl disable libvirtd.service
systemctl disable lvm2-monitor.service
systemctl disable mcelog.service
systemctl disable mdmonitor.service
systemctl disable microcode.service
systemctl disable ModemManager.service
systemctl disable multipathd.service
systemctl disable NetworkManager-dispatcher.service
systemctl disable NetworkManager.service
systemctl disable postfix.service
systemctl disable qemu-guest-agent.service
systemctl disable rngd.service
systemctl disable rtkit-daemon.service
systemctl disable smartd.service
systemctl disable spice-vdagentd.service
systemctl disable systemd-readahead-collect.service
systemctl disable systemd-readahead-drop.service
systemctl disable systemd-readahead-replay.service
systemctl disable tuned.service
systemctl disable vgauthd.service
systemctl disable vmtoolsd.service

个人使用篇

环境变量

​ 当一些软件被安装后,我们想将其加入到环境变量中以便于下次启动该怎么做呢?

​ 这里有两种方案,如果你的软件启动比较单一,则可以使用第一种,如果软件启动较为复杂,如mysqldmysql_safe等则可以使用第二种。

使用软连接

​ 将启动程序投放到/usr/local/bin目录下即可:

ln -s [软件启动程序路径] /usr/local/bin/[软链接名称]

修改/etc/profile文件

​ 这种方式一般来说使用较少,但是也并非没有应用场景,个人还是比较喜欢这种,方便管理。

T > /etc/profile

export PATH=软件启动程序路径目录:$path

​ 最后要记得使用source /etc/profile对配置文件进行重新加载。

​ 如下,对Python3.6.8添加环境变量:

export PATH=/usr/local/Python36/bin:$PATH

内建命令

​ 在Linux操作系统中,所有的命令都是有一些默认参数。

​ 要么在/bin目录下,要么在/sbin目录下。

alias 命令(注意全为小写)的功能是设置命令的别名,以简写命令,提高操作效率。

​ 如命令ll就是ls -l的缩写。

​ 比如在同为类Unix操作系统的Mac平台上,就没有ll命令,对此我们可以通过alias内建命令进行解决:

# 注意,切换为普通用户,且是你常登陆的最好

T > vim /etc/profile

alias ll='ls -lG'
alias ls='ls -G'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias mkdir='mkdir -p'
alias df='df -h'

.bash系列

​ 这一节的内容都建立在你使用bash作为shell的时候,如果是其他类型的shell就不用看了。

​ 在家目录下,有一些隐藏文件,如下所示:

T > ls -a | grep ^.
.
..
.bash_history
.bash_logout
.bash_profile
.bashrc

​ 其实除了这些能够看到的默认就建立的,还有一些未被建立的,他们的作用如下:

文件 描述
.bash_history 存储当前用户输入的历史shell命令
.bash_profile 存储当前用户的一些自定义配置,如alias命令、环境变量等
.bashrc 同上

​ 说起环境变量你可能觉得有点熟悉,诶,这个不是在/etc/profile文件中配置吗?为什么这里也可以配置?

​ 其实,在系统启动后,它加载一些用户配置的顺序如下:

1. /etc/profile    当有用户登录系统后立即执行该文件,后续用户也可以享受配置项
2. /etc/bashrc     每当有用户登录bash shell时都会加载该文件中的配置项
3. ~/.bashrc       当该用户登录bash shell时都会加载该文件中的配置项,其他用户不可享用
4. ~/.bash_logout  当该用户退出时执行的文件,没啥用
5. ~/.bash_profile 效果同.bashrc,一般来说我们会将个人的配置项写在这里

​ 我个人有一个小习惯,会将个人私有的配置项定制在~/.bash_profile中,但是会在~/.bashrc中加入下面一句话,来确保~/.bash_profile能够被成功加载,因为在Mac~/.bash_profile使用iTerm终端时好像并不会加载,就养成了这样的习惯。

source ~/.bash_profile

# 立即刷新配置文件进行应用
posted @ 2020-08-13 10:00  云崖君  阅读(280)  评论(0编辑  收藏  举报