# Linux系统基础
[toc]
### 基本介绍
参考: MOOC《零基础学Linux基础操作》;基本bash命令[知乎Link](https://zhuanlan.zhihu.com/p/452686607#:~:text=1.%E6%B3%A8%E9%87%8A%E6%96%B9%E9%9D%A2%EF%BC%9A%E4%B8%80%E8%88%AC%E6%98%AF%E8%A1%8C%E9%A6%96%E4%B8%AD%E4%BB%A5%20%23%E4%BD%9C%E4%B8%BA%E5%BC%80%E5%A4%B4%202.%E5%A3%B0%E6%98%8E%E8%A7%A3%E9%87%8A%E5%99%A8%E7%B1%BB%E5%9E%8B%E4%B8%80%E8%88%AC%E6%98%AF%E5%9C%A8%E8%84%9A%E6%9C%AC%E7%AC%AC%E4%B8%80%E8%A1%8C%E3%80%82,%E4%BD%BF%E7%94%A8%E6%A0%BC%E5%BC%8F%EF%BC%9A%23%21%2Fbin%2Fbash%20%E5%91%BD%E4%BB%A4%E4%B8%8D%E8%83%BD%E5%92%8C%E6%B3%A8%E9%87%8A%E5%9C%A8%E5%90%8C%E4%B8%80%E8%A1%8C%E4%B8%8A%EF%BC%8C%E4%B9%9F%E5%B0%B1%E6%98%AF%E6%B3%A8%E9%87%8A%E7%9A%84%E5%90%8E%E9%9D%A2%20%3B%20%E5%91%BD%E4%BB%A4%E5%88%86%E9%9A%94%E7%AC%A6%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%9C%A8%E5%90%8C%E4%B8%80%E8%A1%8C%E4%B8%8A%E5%86%99%E5%A4%9A%E4%B8%AA%E5%91%BD%E4%BB%A4)
##### 自由软件的概念
##### Linux的组成
##### Linux的应用
### Linux发展历程
### Linux安装
* 目的,为Linux初学者提供更便捷的**实验环境**
* 方案
> * 安装多个硬盘,每个硬盘装一个操作系统(昂贵)
> * 在硬盘上装双系统(有风险)
> * 使用**虚拟机**操作Linux系统(初学者适用)
### 如何使用命令操作计算机
* 使用命令行操作不需要占用过多的系统资源,对于远程计算机管理和服务器管理,功能十分强大
* 学习基础shell命令(Shell命令即Linux命令):pwd, ls, data, who, cal, uname, wc, su, man,命令补齐等
##### 认识字符终端
* 终端:指用户与计算机交互的一整套设备,包括键盘和显示器等
> 虚拟终端:Linux对终端进行模拟,为用户提供了与计算机系统进行交互的虚拟界面,又称作字符终端
> 字符终端:tty,虚拟终端为字符界面也称作字符终端,CentOs7下一共有6个虚拟的字符终端,共享一套键盘和显示器等输入输出设备(从tty1~tty6)
> 伪字符终端:pts,在图形界面下可执行字符终端提供的功能,如Terminal (Ctrl+Alt+T)
* 切换终端:Ctrl+Alt+(Fn)+F2/F3/.../F7 ,分别对应着6个字符终端;图形界面使用Ctrl+Alt+(Fn)+F1切换
* 退出终端:exit
* who命令:查看本地系统(终端)上的用户信息
> 每一行代表一个用户/终端显示三个字段的内容,用冒号“:”分隔,用户名:终端名:打开的日期
> who am i,查看该终端的基本用户信息
> uname -a:查看系统版本
* 登录提示信息的含义
> 以 \[root@localhost~\]# 为例:其中root代表当前登录的用户,localhost为主机名,~表示用户当前所在目录(当前状态进行操作时文件保存的位置)(~代表用户**主目录**),#代表用户的命令提示符(其中普通用户为$,超级用户root为#)
> > 主目录:主目录是一个变量,随着用户的改变而改变,可以采用pwd查看当前用户的主目录
* pwd命令:查看当前用户的主目录
* su命令:更改当前终端登录的用户
* date命令:显示时间(%Y年 %m月 %d日 %H时-24时制 %I时-12时制 %M分 %A星期 %B月份大写 %a星期缩写)
* cal日历:显示日期(-l显示单月日历 -3显示临近三个月的日历 -s将周日作为月的第一天 -m将周一作为月的第一天 -y显示年历)
* 文本查阅命令:
> cat 从第一行到最后一行
> tac 从最后一行到第一行
> more 按页浏览
> less 按页向前或向后浏览(类似more)
> head -n 显示前n行内容(默认n=10)
> tail -n 显示后n行内容(默认n=10)
##### 在字符终端输入Linux命令
* Shell命令(也称Linux命令)的基本格式:命令名称 \[-选项\] \[参数\]
> 中括号[]语法上表示可有可无
> 命令名称 选项 参数之间要用空格“ ”或Tab“ ”隔开,否则无法识别
> 选项可以包含一个或多个英文字母,选项前必须有“-”,用于和参数进行区别
> 命令,选项和参数都区分大小写
* ls命令:查看目录中文件的内容,相当于图形界面下的打开文件夹功能,默认显示当前目录的文件列表
> 常用选项:-alid
> * ls -a:列出目录**所有文件**,包含隐藏文件以“.”开头
> * ls -l:以**长格式**显示所有文件,即显示文件详细信息
> * ls -i:在输出的第一列显示文件的inode **索引节点**
> * ls -d:仅列出**目录本身的信息**,而非其中的文件列表
> 以-dl, -al. -i常用
* Linux系统提供了命令自动补齐的功能,利用Tab键可以补全命令,若命令有多条,按两次Tab可以显示符合条件的所有命令
> g <Tab> <Tab> :查看以g开头的所有命令
> Linux命令大约有2000多条,因此在熟练掌握基本命令的同时,时常还需要使用说明书查找命令
* man命令(manual):提供命令的说明书
> 格式:man [命令名称],可以使用上下箭头进行命令的滚动查看,此外还可以通过Enter查看下一条,Space查看下一页,q退出Manual页面
* history命令:查看历史输入,存放在.bash_history文件中
> histroy -c 清除当前页面输入
> history -d n 清除第n行记录
##### 通配符和特殊符号的应用
* 通配符:常用于模式匹配,如文件名匹配、路径名搜索、字符串查找等
> \*,\?,通配符分别表示**任意长度,任意内容字符串**,**单个任意字符串**
> \[\],\-可用于指定单个字符或字符范围,在方括号内使用\!表示相反的含义
```
# 列出/etc目录下所有扩展名为conf的配置文件
ls /etc/*.conf
# 列出/etc目录下文件名为三个字母的conf配置文件
ls /etc/???.conf
# 列出/etc目录下所有以abc任意一个字母开头的配置文件
ls /etc/[abc]*.conf
或
ls /etc/[a-c]*.conf
```
其它通配符
* [characters] 匹配任意**一个**属于**字符集**中的字符
* [!characters] 匹配任意**一个**不是**字符集**中的字符
* [[:class:]] 匹配任意**一个**属于指定**字符类**中的字符
* [0-9] 匹配**一个**数字0-9
* **常见字符类**
* [:alnum:] 匹配任意**一个**字母或数字
* [:alpha:] 匹配任意**一个**字母
* [:digit:] 匹配任意**一个**数字
* [:lower:] 匹配任意**一个**小写字母
* [:upper:] 匹配任意**一个**大写字母
* 特殊符号:“\;”,“\&”,“\\”
> \; 用于分隔多个命令,依次执行
> \& 用于指定当前命令在后台执行,执行是返回的结果是该命令的作业号和进程PID号
> \\ 转义符,特殊符号以及通配符在shell中常常被解释为特定含义,通过转义符可以将其转化为原本的含义
```
# 拷贝大文件时需要占用较长时间,此时可以使用&命令
cp f1 /data/f2 &
# 利用echo命令在屏幕上输出反斜杠\
echo \\
```
##### 输入输出重定向
* 由于Linux默认采用键盘输入命令,屏幕输出结果的标准输入输出模式。更改命令的输入、输出方式(如文件或设备方式)需要采用重定向功能。
* cat 命令:默认为查看文件内容,可以与输入输出重定向配合使用
> cat [选项] 文件名
> * -n选项:从1开始对输出内容进行编号显示
> * cat > 文件名:可以结合输出重定向生成小型文件,回车之后即可输入内容,Ctrl+D存盘退出
> * cat f1 f2 > f3:将文件f1,f2合并为f3
* 输出重定向和附加重定向
> \> 文件名:输出重定向,输出结果覆盖原文件内容
> \>\> 文件名:附加输出重定向,输出结果追加到文件结果
```
# 将date命令的结果重定向输出到当前目录的record文件
date > ./record
# 使用cat查看record文件结果
cat record
# 将who命令的结果附加输出到record文件中
who >> record
# 再次采用输出重定向覆盖原record文件内容
date > record
# 使用cat结合输出重定向建立小型文件,如建立文件m1
cat > m1 # 回车开始输入内容
xxxxxx(内容) # Ctrl+D保存并退出
```
* 错误输出重定向
> 将错误的输出储存在特定的文件中
> 格式:命令 2\> 重定向文件
```
#将错误信息保存在err文件中
ls lsm 2> err
```
* 输入重定向
> 以文件方式输入命令内容
```
cat < record #与cat record完全相同,将record的结果作为cat的输入
```
##### 管道和热键
* 管道:“|”,将多个简单命令前后链接起来形成管道流,管道中的每一个命令都将作为单独进程运行,**前一个命令的输出**作为**后一个命令的输入**,从左至右依次执行,**最后一个命令的结果作为输出**显示在屏幕。运用管道可以将多个简单命令集合起来完成复杂功能。
```
# 对当前月的日历结果输出,进行行数统计
cal | wc -l
# 对etc目录下的多个文件和子目录的输出结果传递给more进行分屏显示
ls -al /etc | more
```
* more命令,将大文件以一页一页的形式进行展示,按Enter或Space翻页,q退出
> 格式:more 文件名
* 常用热键,辅助命令编写或终断程序
> 命令编写:Tab自动补齐
```
#如想查找ifcong命令
if Tab Tab
#列出所有if开始的命令,找到ifcong后再补充输入即可
c Tab
```
> 程序终端:Ctrl+c,如采用查找的时候想要终止查找,回到命令提示符
### 如何使用Vi编辑器编写计算机程序
* 用于建立文本文件、编写程序、配置系统环境
* Linux系统下的文本编辑器包括:emacs, nano, Joe, pico, vi与vim等
* Vi(Visual):是一个立即反应的编辑程序,全屏编辑器(Vim是Vi的改进版本,对Vi全面兼容)
##### Vi/Vim的基本用法
* 进入Vi:直接在命令提示符后输入“Vi”
* 工作模式
> 命令模式:键盘的任何输入都作为命令解释,内容不会出现在屏幕上,命令模式可以切换到其余两种模式,而其余两种模式只能通过Esc回到命令模式后再转换
> > 命令模式**进入编辑**状态
> > * **i 模式**:从当前光标位置开始输入字符
> > * **I 模式**:光标移动到该行行首进行输入
> > * **a 模式**:从光标所对应的下一位置输入
> > * **A 模式**:从光标所在行行尾进行输入
> > * o 模式:光标所在行之下新增一行
> > * O 模式:光标所在行之上新增一行
> > 命令模式下**删除内容**
> > * x :删除光标所在字符
> > * nx :从光标所在位置向前删除n个字符
> > * X :从光标前一位置删除一个字符
> > * nX :从光标的前一位置向左删除n个字符
> > * dd :删除整行
> > * D :从光标位置删除到行尾
> > 命令模式下**撤销操作**:
> > * u : 撤销操作(上一步)
> > * . : 取消撤销(下一步)
> > 命令模式下**查找内容**
> > * /字符串:从光标当前位置开始向文件**尾部**查找,找到后光标停留于字符串首字母位置
> > * ?字符串:从光标当前位置开始向文件**头部**查找,找到后光标停留于字符串首字母位置
> > * n :向同一方向继续查找
> > * N :向反方向继续查找
> > 命令模式下**复制黏贴**:
> > * yy :复制当前行的内容到缓存区
> > * nyy :复制包含当前行的后n行到缓存区
> > * p :黏贴
> > * r :替换黏贴,替换内容为光标后的一个字符
> > * R :替换黏贴,替换内容为光标后的整行字符
> 插入模式:编辑模式,输入任何字符都会被作为文件内容显示
> 底行命令模式:输入“:”进入,可以进行相关配置以及文本块操作,**wq**保存并退出,**q!** 直接退出
> > 底行命令下的文本块操作
> > * : set nu #每行前显示行号,取消显示可用set nonu
> > * : n1 n2 co n3 #将1 2行复制到第三行**之下**
> > * : n1 n2 m 3 #将1 2 行移动到第三行**之下**
> > * : n1 n2 d #删除包含1 2 行的之间所有内容
> > * : n1 n2 s/str1/str2/g #将1 2 行之间(含)所有内容中的str1替换为str2
##### 使用gcc编写C语言程序
* 功能:调用C语言编译器,执行命令后将完成预处理,编译,优化,连接并生成可执行代码
* 格式:gcc [-coO] 源代码文件名
> 源代码文件名必须带有".c"的扩展名
> 可执行代码默认保存在工作目录的a.out文件中
* 常用选项
> -c
> -o name:指定输出程序的名字
> -O
```
# 不带参数的编译步骤
vi hello.c #用Vi编辑器编写源代码,储存成*.c文件
gcc hello.c #用gcc不带参数编译
ls #用ls查看可执行程序a.out是否存在
./a.out #执行该文件
```
### 如何查找、复制、移动文件
##### Linux文件简介
* 广义上说,Linux系统中一切皆文件;狭义地说,文件指的是磁盘文件
* 定义:Linux中的文件是一个字符流序列:
> 普通文件
> 目录
> 磁盘、硬件、打印机等设备
* 文件的成分(内容)
> 索引结点(inode):对文件信息的介绍,如文件权限、文件主、文件大小、存放位置、建立修改日期等。文件使用i结点(inode)作为标识符,同一文件使用相同的i结点(inode)号。
```
# 查看文件的i结点信息
ls -i
```
> 数据:文件的实际内容
* 文件名规则
> 1. 文件名最长为255字符,除了斜线/与空格之外,可以使用任何ACSⅡ字符(但应该注意避免使用特殊字符)
> 2. 习惯上允许使用“_”与“.”区别文件类型,同类文件应该使用相同的后缀或者扩展名
> 3. 文件名区分大小写
> 4. 以圆点“.”开头的是隐藏文件
```
# 查看隐藏文件
ls -a
```
* 创建文件的方法
> 1. Vi编辑器方法
> 2. 输入输出重定向方法
> 3. touch命令
```
# 采用Vi编辑器创建文件(Vi编辑器基本用法)
vi filename
# 利用输入输出重定向的方法
cat > filename
cat >> filename
# 采用命令的方式建立普通文件(非目录)
touch [filename] # 用于更新一个文件的访问和修改时间,如果没有该文件则创建一个文件
```
* 文件的删除
> rm操作,**注意:rm是一个危险操作,文件一旦删除则不可恢复**
```
rm [-选项] [文件名]
# -f 文件名,不提示直接强制删除
# -r 目录名,递归删除目录文件
```
##### Linux的目录
* 文件目录:用于标识系统中的**文件及物理地址**,提供给检索文件使用
* 多个文件的目录项,组成了Linux的目录文件
> 文件目录项:包含**文件名**以及**inode**号
* 目录结构:Linux系统中不仅仅把普通文件和目录作为文件,同时也将磁盘设备也当做文件进行处理,按照树形结构进行管理
> 文件系统层次结构标准(FHS)
> * / :Linux系统目录树的起点,根目录
> * bin:**命令文件目录**,也称二进制文件目录,binary
> * boot:存放系统**内核文件**以及**引导装载程序**文件
> * dev:设备文件目录,存放所有的设备文件,如cdrom为光盘设备
> * etc:存放系统配置文件,如password文件
> * home:包含系统中各个用户的**主目录**,子目录即各个用户的用户名
> * lib:存放各种编程语言库
> * media:系统设置的**自动挂载点**,如**u盘**,**硬盘**等
> * opt:表示option,有些软件包被安装在此
> * usr:最大的目录之一,很多系统中该目录是作为**独立的分区挂载**的
> * mnt:用来挂载临时的文件系统,为某些设备默认提供挂载点
> * proc:虚拟文件系统,该目录中的文件是内存中的映像
> * sbin:保存系统管理员或者root用户的命令文件
> * tmp:存放临时文件
> * var:存放容易变化的内容如log, e-mail等
> * root:超级用户(系统管理员)的主目录
##### 文件路径
* 含义:表示文件在系统中的存放位置
> 由于Linux系统不存在分区,所有文件均被挂载到根目录“/”下
* 分类:绝对路径与相对路径
> 绝对路径:由**根目录**出发,到达**目标文件或目录**的路径
> 相对路径:从**当前目录**出发直接到达**文件或文件目录**的路径
```
# 打开绝对路径需要从“/”出发
/home/user/file1.sh
# 打开相对路径则不需要用“/”指定从根目录出发
# “~/”表示从当前用户的主目录出发
~/file.sh
# “./”表示从当前工作目录出发
./file.sh
# “../”表示从当前工作目录的上一层目录出发
../user/file.sh
#若查找的文件在当前工作目录下,也可以省略“./”直接输入文件名
file.sh #错误写法 "/file.sh"
```
##### 文件类型
* 一切皆文件
> 普通文件(-)(f)
> * 常规文件,系统中以“-”标识,包含各种长度的字符串
> * 如文本文件(信件、脚本等)、数据文件(电子表格、数据库等)、可执行的二进制文件(Linux系统中提供的各种命令)
> 目录文件(d)
> * 目录也称文件夹,是一种特殊的文件
> * 目录的第一项:表示目录本身,用“.”作为文件名,e.g. "./user/file.sh"
> * 目录的第二项:表示该目录的父目录,用“..”表示
> 设备文件(c, b)
> * 设备文件除了存放在文件**节点中的信息**外,不包含任何数据(相当于一个路标),可以像操作普通文件(f)一样对设备文件操作
> * 设备文件通常存放在/dev目录下:字块(**c**haracter)设备:如键盘、终端、打印机等;块(**b**lock)设备:硬盘,光盘等
> 链接文件(l)
> * Linux具有给**一个文件起多个名字**的功能,称为链接。类似于windows系统中的快捷方式。# 详情见链接专题
> 套接字文件(**s**ockets)
> 管道文件(**p**ipe)
* 利用 ls -l 查看文件类型
* ![7101632d3bc60972ab85b14dd67a90f2.png](en-resource://database/645:1)@w=300
* 利用file 查看文件类型,file [filename]
##### 文件操作
文件的复制 cp,链接 ln, 删除 del, 查看 ls, 查找分类(find grep sort见下文)
##### find grep 命令文件查找、检索, sort 命令排序
###### find 命令
> 功能:指定路径和表达式查找匹配(满足表达式)的文件(广义,包含目录),搜索是递归性质的
> 格式:find \[路径...\] \[表达式选项\] \[操作\],同时可以结合管道功能“|”进一步计算包含文件数量
* **常用表达式**
* 布尔逻辑 与或非
> -a 表示和(and)
> -o 表示或(or)
> ! 表示非(not)
* 按文件名查找 -name,可以使用通配符
```
find /home -name test* #在home目录及其子目录下查找所有带有test的文件
```
* 按文件类型查找 -type,f为普通文件,d为文件夹,b为块文件,c为字块文件……
```
find /dev -type [fdbcspl]
find /dev -type d -ls #查找目录文件并进行列出操作
```
* 按文件大小查找 -size \[+-\] \[ckMG\],+=大于,-=小于,c字节,k=kb,M=MB,G=GB,注意区分大小写!
```
find -siza -15k #查找当前目录下所有小于15kb的文件
find -size +1M #查找当前目录下所有大于1Mb的文件
find -size 10k #查找当前目录下等于10kb的文件
find -size +100k -size -200k #查找大于100k小于200k的文件
```
* 按用户名-name, 组名-group, 权限值-perm, 时间属性-\[acm\]time(min) 进行查找
> atime -n
> ctime -n
> mtime -n: 文件读取时间,n的单位为天
* 有时候文件列表太长,可以采用wc命令,计算文件个数
```
find /dev -type fd -ls | wc -l //wc 为wordcount命令,-l为计算文件行数,此外还可以用于计算字符数,单词数
```
* **操作**
* 默认操作为将所有查找得到的文件信息打印至终端
* **删除**搜索到的结果 -delete
* 对搜索到的结果**执行特定命令** -exec 命令名 {} \;,其中花括号用来作为检所得到的命令的占位符(有点类似于python中的.format?),分号用于表示结束(由于分号在Linux中有特殊含义,故加上转义符\)
```
#对查找的结果,用chmod命令进行权限等级修改
find -type f -perm 664 -exec chmod 777 {} \; #将找到的权限等级664的文件改为777(最高权限)
```
###### grep 命令
* 功能:从指定**文本文件**或**标准输出**中查找符合条件的字符串,默认**显示字符串所在行的内容**
* 格式:grep \[-选项\] 字符串 \[文件\]
* **常用选项**
* -i 忽略(ignore)大小写
* -n 在显示符合条件的字符串前显示行号(number)
* -v 显示不包含指定字符串的行
```
# 查找file1 中不含井号的行
grep -v # file1
# 在根目录etc文件夹passwd文件中检索root字符串
grep root /etc/passwd
cat /etc/passwd | grep root #两行内容等价,用户属性的内容详见"用户管理"一章
# 在fa/fq文件中搜索序列条数,即开头为大于号“>”的字符串的数量,由于“>”具有重定向的含义,应该用引号转为字符串或使用转义符
grep -c "^>" [文件路径及名称]
```
###### sort 命令
* 功能:对文件进行排序和合并
* 格式:sort \[-选项\] \[文件列表\]
* **介绍**
> sort file1 :对file1文件按照每行第一个**字符**顺序进行排序后输出
> sort file1 file2 :对file1 file2两个文件进行**合并**后按第一个**字符**排序输出
> sort -r :对file1每行第一个**字符**进行反向排序(**倒序**)后输出
> sort -r -o outf1 file1 :对file1进行反向排序后将结果**输出到outf1**
> sort -n file1 :对file1每行第一个**字段**进行数值排序,字段指由空格分隔的部分
> sort -n -k 3 file1 :对file1每行第三个**字段**进行数值排序
```
#把目录下所有文件按从小到大顺序排列
ls -l | sort -n -r -k 5
```
##### 目录操作
| 命令 | 功能 |
| --- | --- |
| 1.**mkdir** | 新建目录 |
| 2.**cd** | 切换目录 |
| 3.rmdir | 删除目录 |
| 4.**pwd** | 显示当前工作目录 |
| 5.**ls** | 列出目录内容 |
| 6.rm | 删除目或文件 |
| 7.mv | 移动或重命名目录或文件 |
| 8.cp | 复制目录或文件 |
* mkdir 命令,用于建立目录
```
# 新建目录,dir1 dir2
mkdir dir1 dir2
# 递归生成目录,-p选项
mkdir -p dir3/dir4
# 指定生成目录的权限,-m选项 权限值
mkdir -m 777 dir6
```
* cp 命令,用于复制文件或目录
```
# -r 以递归方式复制目录(保留源目录结构)
# -b 若存在同名文件,覆盖前先备份原来文件,备份的文件将以filename+“~”的形式保存
cp -b f1 f2 #若f2已存在,将生成原f2的备份f2~
# -a 复制目录
```
* mv 命令,用于移动或重命名文件或目录
> 格式:mv [-bf] 源文件或目录路径 目标文件或目录路径
```
# -b 遇到同名文件时,先备份原文件
# -f 强制覆盖同名文件
mv m* dir1 #将多个以m开头的文件移动到dir1中,相当于剪切
```
##### 文件权限
* **文件权限**指文件的访问控制,即哪些用户可以访问文件以及执行什么样的操作
* 用户分类
> * 文件所有者 owner:建立文件或目录的用户
> * 同组用户 group:文件所属群组的所有用户
> * 其他用户 other:非所有者也非同组的用户
* **访问权限**
> * 读取权限(r):浏览文件/目录内容的权限
> * 写入权限(w):修改文件内容;更改删除目录的权限
> * 执行权限(x):对于可执行文件而言,允许执行或查找;对于目录而言允许进入的权限
> * 无权限(-):不允许读写或执行
> 权限具有文本、二进制、八进制数字表示的三种方式
> 默认权限:新建一个文件/目录时系统会为文件设置默认的权限,该权限值与umask值有关,可利用umask命令查看当前系统的umask值
```
# 利用ls -l 命令可以查看文件权限
ls -l ↓
d rwx r-x r-- ...... # 第一个字段表示文件类型,第二字段的三位字母表示文件属主对文件的权限,第三字段表示同组用户的权限,第四字段表示其他用户的权限,'r' 'w' 'x'分别为'读' '写' '执行','-'为无权限
# 权限的表示还可以采用数字方式
d 111 101 100 …… # 含义与rwx r-x r--相同
# 将三位数构成的二进制数码转化为八进制可以发现,数字从低到高0-7可以分别表示权限从低到高的不同等级
d 7 5 4 …… # 含义与rwx r-x r-- 相同
```
* **权限管理相关命令**
* ls -l :查看文件权限
* chmod :修改文件访问权限
> 格式1(字母模式):chmod \[对象\]\[操作符\]\[权限\] [filename]
> * 对象:u(user) g(group) o(other) a(all)
> * 操作符:+(增加) -(减少) =(赋予给定权限)
> * 权限:r(read) w(write) x(executive)
```
# 给同组用户增加 x 权限,给其他用户减少 r 权限
chmod g+x o-r file
```
> 格式2(数字模式):chmod \[权限的八进制数字形式\] \[filename\]
```
chmod 664 file
```
* chown (change owner):修改文件所有者 (可以利用“:”修改文件组群)
> 格式:chown \[新所有者\] \[filename\]
> 格式:chown : \[新组群\] \[文件名\]
```
touch f1 #建立文件f1
useradd ly #建立新用户ly
chown ly : ly f1 #修改所有者以及组群为f1
```
* chgrp (change group):修改文件及其所属群组
> 格式:chown \[新组群\] \[文件名\] #与chown相比少了一个':'
### 对Linux的使用者进行管理
> 学习如何识别系统的不同用户和组群;
> 学习用户系统配置文件:passwd, shadow;
> 学习组群系统配置文件:group、gshadow;
> 用命令进行用户和组群管理
* Linux是多用户分时操作系统,允许多个用户同时对系统进行操作,用户管理的核心是对**用户**及其**资源使用**的各种权限审核
* 账户
> 账户是一个用户在系统上的标识,可以分为用户账户和组账户
> 用户账户:文件,进程,任务给每个用户提供特定的工作环境
> * 用户账户可以分为*超级用户*(root),*系统用户*(伪账户,虚拟用户),*普通用户*
> 组账户:具有相同特征用户的集合体
> * 组账户可以分为*私有组*和*标准组*,对于同一用户有多个组的情况还可分为*主组*(登录后所属的组)和*附加组*
> 同一个用户可以属于多个组
#### **/etc目录下用户及相关配置文件**
* passwd文件:
* 位置:/etc/passwd
* 作用:保存各个用户的账户信息(密码除外)
* 文件格式:每一行定义一个用户的账号,一行中又划分为多个字段,定义用户账号的不同属性,各字段之间用冒号“:”分隔。
> passwd字段:用户名 : 密码 : 用户ID(UID) : 组群ID(GID) : 用户全名 : 用户主目录 : 使用的shell #注意:所有用户都可以查看该文件内容,密码采用x填充,不明文保存
> * 用户ID(UID):超级用户的UID为0,系统虚拟用户UID为0~999,普通用户UID从1000开始
> * 组ID(GID):默认情况下,每个账户建立后系统都会建立一个与账户ID(UID)相同的组,如果一个组内只有一个用户则成为*私有组*。
* shadow文件:
* 位置:/etc/shadow
* 作用:保存各种用户的账户密码等信息
* 文件格式:类似于passwd,一行一账号,各字段之间用冒号“:”分隔
> shadow字段:用户名 : 口令 : 最后一次修改时间 : 最小时间间隔 : 最大时间间隔 : 警告时间 : 不活动时间 : 失效时间 : 标志
> * 口令:默认使用MD5加密,为一串字符串,若用户未设置密码则显示感叹号“!!”或星号“\*”
> * 3~8字段为密码的保护功能
> > 最后一次修改时间:从1970年1月1日起到上次修改密码日期之间的天数
> > 最小时间间隔:自上次修改密码起,再次修改密码需要间隔的天数,0表示可以立刻修改密码
> > 最大时间间隔:自上次修改密码起,至该密码过期(需要强制修改)的间隔天数,99999表示永不过期,即不需要强制修改
> > 警告时间:密码过期前,提前向用户发送警告信息的天数,默认七天
> > 不活动时间:密码过期后,系统推迟关闭该用户账号的天数
> > 失效时间:从1970年1月1日起到账户过期之间的天数 (默认不启用)
> 标志:预留字段
* sudoers文件:
* 位置:/etc/sudoers
* 作用:管理sudo权限
#### **如何管理用户**
**常用命令**
* useradd:新建用户账号
> * 格式:useradd [-degsuD] 用户名
> * 默认为新建用户账号,通过选项可管理用户账号
> * -d选项:设置用户的宿主目录
> * -e选项:设置账号的过期日期
> * -g选项:设置用户的所属组名
> * -s选项:设置用户所使用的shell,默认/bin/bash (部分默认为/sh,需要后期修改)
> * -u选项:设置用户的UID,唯一且大于等于1000
> * -D选项:显示用户所使用的默认值(Default)
> * -m选项:在创建用户时同时创建home目录(默认为-M不创建)
> * -p选项:设置密码
* id:查看用户ID,包括UID和GID
> * 格式:id [用户名] ,如不指定用户名则查看当前用户的用户名
* userdel:删除指定用户
> * 格式:userdel [-r] 用户名
> * -r选项:删除用户的同时删除用户所有相关文件,包括宿主目录以及用户邮件池等
```
# 管理用户的操作必须在超级用户root权限下使用
su root
# 添加用户Tom
useradd -m -p passwd Tom
# 此时可以发现在/etc/passwd以及/etc/shadow文件末尾都添加了一行内容用于表示用户信息
cat /etc/passwd
cat /etc/shadow
# passwd为用户设置口令
passwd Tom
# 设置口令后方可登录,利用usermod修改用户全名为Tommy(注意:修改全名用-c选项,修改用户名需要采用-l选项),修改用户主目录为/home/Tommy(注意:新主目录不论其是否真实存在都可成功修改),修改UID为1010
usermod -c Tommy -d /home/Tommy -u 1010 Tom
# 利用id命令查看用户id信息是否成功修改
id Tom
# 利用userdel命令删除Tom的用户信息
userdel -r Tom
```
* passwd:新建或修改用户口令
> * 格式:passwd \[-S\] 用户名
> * 默认为新建或修改用户口令(要求密码大于8位),通过选项可以管理口令
> * -S选项:查看口令的状态,提示加密算法
* usermod:修改用户属性
> * 格式:usermod \[-acdefgGlLuU\] 用户名
> * -a 添加,通常与-G连用-aG group将用户添加入组
> * -c 全名:指定用户的全名
> * -d 全目录:指定用户的主目录
> * -e 有效期限:指定用户账号的有效期限
> * -f 缓冲天数:指定口令过期后多久关闭此账号
> * -g 组群ID或组群名:指定用户的主要组群
> * -G 组群ID或组群名:指定用户的附加组群
> * -l 新用户名:修改用户名
> * -L :锁定指定用户账户
> * -u 用户ID:指定用户ID
> * -U :解锁指定账户
> * -s:修改用户所使用的shell
##### **trouble shooting**
home目录下看不见用户文件夹;当前用户不在sudoers列表中;Ubuntu不显示用户名只显示"$"
> 1. 需要添加-m选项指定在创建用户的同时创建用户目录
> 2. 修改sudoers配置文件
#### **群组及相关配置文件**
* 组(账户):组账户与用户账户之间为多对多的关系
> 当一个用户属于多个组时,在passwd文件中显示的是用户所属的**主组**,其它组成为附加组
> 用户要访问其他组的文件时,必须使用newgrp命令成为所要访问组的成员
* **/etc目录下与组相关的配置文件**
* group,位于/etc/group,用于保存用户账户的分组信息
> 各字段内容:组名 : 组口令 : 组GID : 组成员
* gshadow,位于/etc/gshadow,用于保存组口令信息
> 各字段内容:组名 : 组口令 : 组管理员账号 : 组成员列表
> 由于目前存在sudo这类命令,创建组管理员的命令已不常用
* **如何管理群组**
* 常用命令
> groupadd命令:新建组群
> * 格式:groupadd \[-gnG\] 组名
> > -g GID:指定新建组的GID(>1000)
> > -n 新组名 原组名:更改组名
> > -G 组名 用户名:将用户添加到组中
```
# 将用户添加入sudo群组
groupadd -G sudo <用户名>
# 建立GID为1010的组群Ly
groupadd -g 1010 Ly
# 查看group文件中的后五条内容
tail -5 /etc/group
# 重命名Ly组为Lnew
groupadd -n Lnew Ly
# 利用groupdel命令删除空组Lnew
groupdel Lnew
# 如果组非空,需要用‘’userdel -r 用户名‘’命令删除组下的主用户;或使用“usermod -g 其它组”将用户的主组改变为其它组
```
> groupdel命令:删除组
> * 格式:groupdel 组名,注意:①不能删除其他用户的主组群(包括私有组)②要删除的组必须存在
> gpasswd命令:将用户添加到某个组或删除
> * 格式:gpasswd \[-adA\] 用户名 组名
> > -a 用户名 组名:将用户添加入组
> > -d 用户名 组名:将用户从组删除
> > -A 用户名 组名:将用户指定为组管理员
> groups命令:查看用户属于哪一组,格式为'groups 用户名'
### 软件的安装和维护
* 使用RPM和yum服务安装软件
##### 以软件包的方式安装
软件包:指软件提供方已将软件编译好,并且将所有相关文件打包后所形成的一个安装包文件
软件管理:不同类型的安装包需要使用不同的**软件包管理工具**完成管理工作
* **.rpm包**(Rethat Package Manager,RPM Package Manager):由Rethat公司提出,在Rethat,Fedora,CentOs系统中使用,对应的软件包管理工具称为rpm包管理器
* RPM功能:安装,卸载,升级,查询,验证
* RPM优势:①提供快速的安装、减少编译和安装的困扰;②维护系统要比以往容易得多;③可以进行功能强大的软件包查询和验证工作;④对软件进行升级时不需要重新配置
* 获取RPM包:www.rpmfind.net;从官网站点中查找;从发行套件的光盘中查找
```
RPM包的名称格式:name -version.type.rpm #name-软件名,version-软件版本号,type-包的类型(适用的硬件架构)
E.g.
httpd-2.0.40-21.i386.rpm #i[3456]86代表Inter X86计算机平台上编译的软件版本
httpd-2.0.40-21.src.rpm #src表示软件源代码
# 安装net-tools工具,显示进度
rpm -ih net-tools
# 删除
rpm -eh net-tools
# 查询
rpm -qa #显示所有已安装rpm包
rpm -q net-tools
```
* RPM包安装和删除的常用命令:rpm -[ivhe] <RPM包名>
> -i:安装
> -v:在安装中显示详细的安装信息
> -h:显示水平进度条 “#”
> -e:删除包,可以不用写包的详细版本信息,只写包名称即可
* RPM包的查询:
> rpm -qa:查询所有的rpm安装的软件包
> rpm -q <包名>:查询指定软件是否安装
> rpm -qp <RPM包文件名>:查询包中的文件信息,用于安装前了解包的信息
> rpm -qi <包名>:查询已安装包的描述信息
> rpm -ql <包名>:查询已安装包中包含的文件
> rpm -qf <文件名>:根据文件查询文件所属的RPM包
* RPM包的升级:
> rpm -Uvh <包名>:升级实际上是删除和安装的组合
> RPM包的验证:
> rpm -V [参数]:参数可以是包名,文件名或空;检查包中文件是否与安装的一致,验证后通常没有提示信息
* **.deb包**():有Debian公司提出,在Debian,Ubuntu中使用,对应的软件包管理工具称为dpkg
> * 特点:安装比较简便,但存在软件包依赖关系
```
dpkg -i net-tools
dpkg -r net-tools
```
##### 以在线的方式安装
为了避免软件包依赖对于用户安装的影响而产生的软件安装方式
* **yum**(Yellowdog Updater Modified):对应于rpm包
* **apt** (Advanced Packaging Tool):对应于deb包
* 特点:安装简便,但需要访问网络服务器
> 利用yum包进行软件安装管理:yum \[选项\] \[命令\] \[包\]
> > 选项:包括-y与-q:-y 当安装过程中提示选择全部选择‘yes’; -q 不显示安装过程
> > 命令:为所要进行的操作
> > 包:为要操作的对象
* yum的常用安装、删除命令
> yum install <软件包或程序名>:**安装**
> yum update <软件包名>:**更新**
> yum remove <软件包名>:**删除**指定软件包
> yum clean <软件包名>:**清除缓存目录**下的软件包
* yum的常用查询操作
> yum list <包名>:查询指定软件包**安装情况**
> yum info <包名>:查询指定软件包**详细信息**
##### 以源代码的方式安装
* 自由软件提供了一整套软件的源代码,需要利用**GCC和make等工具**对源代码进行编译后得到可执行的二进制文件;还需要对可执行文件以及相关配置文件放置在正确的文件系统路径位置;此外可能还需要修改一些系统的配置参数才可以完成全部安装过程。
* 特点:安装复杂性较高
[配置环境变量](https://blog.csdn.net/hehedadaq/article/details/115130945)
### 如何处理最消耗资源的耗子进程
* 本质上是进程管理的问题
* 进程管理的基本内容
* 进程的监视控制(ps, top, kill进程监控命令)
* 进程的优先级(nice, renice谦让度命令)
* 守护进程与系统维护(runlevel, init, systemctl系统维护管理命令)
##### 进程管理基本内容
进程概念
* 程序的一次执行过程,可以包含许多个线程
* 资源分配和管理的基本单位
进程的分类
* 系统进程:操作系统启动后,系统环境平台运行所加载的进程
* 用户进程:与终端相关联,是用户所执行的进程
* 守护进程:在后台运行的进程,有时候也称为服务
进程管理的内容
##### **监视**进程相关信息
> PID(PROCESS ID):进程号
> PPID(Parent PID):父进程号
> USER/UID:执行该进程的用户名/用户ID
> TTY:启动该进程的终端
> PRI:进程优先级,数值越小↓ 优先级越高↑
> NICE:进程谦让度,表示对CPU需要的迫切度
> %CPU:进程占用的CPU比例
> %MEM:进程占用的内存比例
> TIME:进程占用的CPU时间,STIME进程从开始到现在运行的总时间
> ADDR:进程在内存中的地址
> RSS:进程占用的内存大小(KB)
> CMD:进程启动命令
> STATE, S:进程状态
> > S:睡眠状态
> > D:不间断睡眠(挂起)
> > Z:僵尸状态
> > R:运行或准备运行
> > T:停止或追踪
> > W:进程没有驻留页(等待)
> > N:低优先级
> > I:空闲
* 进程监视命令
* ps,报告进程相关信息,ps [-选项]
* top,实时报告进程相关信息,top [-d]
* htop,报告进程和内核使用信息,需要安装相应包
* pstree,显示进程家族树的信息,pstree \[-p显示家族树信息\] \[-u <用户名>\] [<进程PID>号,显示进程的家族树信息]
* lsof (list open files),列出由某进程打开的所有文件,lsof \[选项\] \[文件或目录路径\]
```
# ps -le 以长格式(-l)显示所有进程(-e)信息
# ps -aux 显示所有用户进程(-a)显示没有控制终端的进程(-u)显示用户名和启动时间等信息(-x)
# 将进程按PID排序
ps -aux --sort pid
# top,动态显示进程信息,使用-d <int>命令修改刷新时间(s),可直接输入大写首字母对特定信息排序,输入大写“I”可以反向排序,如十秒钟刷新一次的方式显示系统进程
top -d 10
“q”退出
# top,动态显示进程中删除指定进程,输入大写"K"后根据提示输入PID即可
# top,监视指定用户,输入大写“U”根据提示输入用户ID即可
# lsof -p <PID> 显示该进程打开的所有文件
# lsof -u <用户名> 列出该用户所打开的文件
```
* 进程控制命令 Kill
> 向特定进程发送信号,格式为kill \[-选项\] \[-信号名称\] [PID列表]
> -l,列出系统中定义的信号
![fd5b1c95aa8f5a8ff1d49eb525eeabcf.png](en-resource://database/646:1)@w=500
```
# 杀死vi进程,编号为5258
kill -9 5258
```
* 调整进程**优先级**
> 进程优先级(PRI)指在进程调度时用于判断进程能否获得CPU的依据之一
> > 用户无法直接调整优先级,只能通过谦让度间接调整优先级
> > 数值越低↓ 优先级越高↑,普通进程的优先级默认为80
> * root用户能够调整自己和其他用户进程nice值,范围-20~19;
> * 普通用户只能调整自己进程的nice值,为了避免普通用户抢占系统资源,nice值调整为范围在0~19,且只能往高处调整
* nice调整谦让度
> 设置**将要启动**的进程的谦让度,nice \[-选项\] <将要启动的命令>
> -n <int>,设定谦让度,<int>范围在-20~19
* renice调整谦让度
> 调整已存在进程的谦让度,renice \[-选项\] <PID>
> -n <int>,重新设定谦让度,<int>范围在-20~19
```
# sudo命令,采用管理员权限执行下命令
# 设置进程vi 的谦让度为-3
sudo nice -n -3 vi
```
##### **守护进程**
Linux系统中的守护进程
![d73ad22e115cf4b1af77d509519c0ecd.png](en-resource://database/647:1)@w=500
> atd,提供执行**临时作业**的服务
> crond,提供执行**周期作业**的服务
> syslogd,提供系统日志服务
> auditd,提供系统审计服务
> network,提供激活/关闭各个网络接口的服务
> iptables,提供网络防火墙服务
> sshd,提供安全的**远程连接**服务
> vsftpd,提供网络文件传输服务
> smbd,提供局域网络文件共享服务
> named,提供域名解析服务
> httpd,提供网页内容服务
> xinetd,超级守护进程,提供对各项服务统一管理的服务
* systemctl 命令操作守护进程
```
```
### 布置作业(作业管理)
* 内容
* 作业,作业查看和布置
* 一次性作业
* 周期性作业
* 目标
* 了解作业,前台和后台的概念,对作业进行前台后台控制
* 学习安排一次性**at作业**以及周期性**cron作业**
##### 作业、作业查看及布置
作业(JOB)的概念:指用户向系统提交并要求执行的任务;一个作业对应于一个或多个进程。
前台与后台:前台即命令行界面,一次只能执行一个作业;为了提高系统利用效率,往往会使用“&”让作业在后台执行
> 在命令末尾使用“&”可以将此作业放在后台执行
> 在作业运行中使用Ctrl+z可以将此作业放在后台中挂起(暂停)
作业查看相关命令
* jobs命令,jobs \[-选项\] [作业号]
> -l,列出作业**详细信息**,包括构成作业的进程列表
> -s,列出**停止/暂停**状态的作业
> -r,列出正在**运行**的作业
* fg命令,fg [作业号]
> 让后台作业恢复到**前台运行**
> 默认将最近一个放置在后台的作业(显示为“+”,第二个显示为“-”)恢复到前台。
* bg命令,bg [作业号]
> 让前台命令恢复到**后台运行**
* 停止后台作业的方法
> 1. 查出进程PID号,用kill -9 <PID>命令
> 2. 将作业放置到前台,使用Ctrl+c快捷键
```
# 作业相当于命令,以下命令即一个作业,对应了ls、more两个进程
ls -l /etc| more&
```
##### 布置一次性作业“at”
* at命令
> 在将来的特定时间执行命令,at [-选项] <sometime>
> systemctl status atd.service,查看守护进程状态
> systemctl start atd.service,开启守护进程
> 输入1~多条命令后 ctrl+D 保存并结束
> sometime的格式
> * 绝对计时:小时:分钟(e.g. 23:59),小时:分钟 月日年(e.g. MMDDYY或MM.DD.YY或MM/DD/YY)
> * 相对计时:now <时间间隔> <单位>,时间单位为minutes, hours, day, week(e.g. now +2 min)
> 主要选项
> -I,显示等待执行的作业
> -d <作业号>,删除指定作业
> -f <filename>,从指定文件中获取将要输入的命令
> at命令的配置文件,*可能需要手动添加*
> /etc/at.allow:使用at命令时首先对此文件进行查找,写在此文件中的使用者才可使用at命令
> /etc/at.deny:如果没有at.allow文件,则进一步查找at.deny文件,写在此文件中的用户不可以使用at命令
> 如果上述两个文件均不在,只有root用户可以使用at命令;此外系统可能保留一个空的at.deny 文件,意味着所有用户均能够使用at命令(危险)
* crontab命令
* 周期性执行命令,利用crontab命令去执行一个已经创建好的cron作业列表文件,crontab [-u <USER>] filename
> systemctl status crond.service,查看守护进程状态
> systemctl start crond.service,开启守护进程
> -u <user>是超级用户root为普通用户创建cron作业,没有指定用户时则指用户本身
> filename是已经编辑好的cron作业列表文件,也称crontab文件
* crontab的编写及其选项
> crontab文件的编写,六个字段之间用tab隔开
![380d0173d2b558225021277faeea8b70.png](en-resource://database/648:1)@w=500
> 特殊符号
> \* :所有取值范围内的数字
> “/”:每的意思,如“\*/5”表示/5个单位
> “-”:表示某个数字到某个数字
> “,”:用于连接几个离散的数字
> -l,列出所有执行的计划
> -e,编辑用户的作业执行计划
> -r,删除用户的作业执行计划
* cron命令的配置文件
> /etc/cron.allow
> /etc/cron.deny
```
# 查看守护进程atd的状态
systemctl status atd.service
# 设置两分钟后删除user目录下newdir目录
at +2 minutes
at> rm -r /home/user/newdir
Ctrl+d
# 设置在2022年4月26 23:59重启系统
at 23:59 04262022
at> reboot
Ctrl+d
# 采用附加重定向 向配置文件at.deny中添加用户(一个用户名一行)
echo user >> /etc/at.deny
# 利用at输入命令时最好采用命令全路径,采用whereis <命令名>的方法查看命令的全路径
whereis reboot
# 布置周期性作业首先需要查看守护进程crond的状态
# 查看配置文件crond.deny、crond.allow
# 编写ct(crontab)文件
# 执行
crontab ct1
# 查看
crontab -l
# 编辑
crontab -e
# 删除
crontab -r
```
### 磁盘管理基础
内容
* 硬盘分区基础
* 文件系统的创建与检查
* 磁盘文件系统的挂载与卸载
目的
* 学习硬盘分区的概念,使用fdisk命令创建/查看分区信息;
* 学习格式化的概念,学习常见文件系统类型,使用mkfs、fsck等命令创建文件系统,检测修复文件系统中的错误;
* 学习挂载的概念,会使用mount命令手动挂载和卸载文件系统;
* 理解/etc/fstab配置文件,学会使用配置文件自动挂载常用的文件系统。
##### 硬盘分区
Linux中增加硬盘的操作步骤
* **分区**→**格式化**→**挂载**→使用
硬盘分区基础
* 硬盘按照接口的不同可分为IDE硬盘,SCSI硬盘,SATA硬盘
* 使用硬盘前必须先进行分区
* 主分区1~4个
* 扩展分区0~1个,扩展分区可以细分为多个逻辑分区(不限制数量)
![b010e71d16c36d7390aeebf9d80c144a.png](en-resource://database/649:1)@w=500
* 硬盘的设备名,IDE接口硬盘/hd表示,SCSI SATA USB接口硬盘/sd表示
> 系统的第一块IDE接口硬盘称为/dev/hda,其第一个分区称为/dev/hda1
> 系统第二块IDE接口硬盘称为/dev/hdb,其第三个分区称为/dev/hdb3
> * 注意:数字1~4通常留给主分区
* 光盘设备名/dev/cdrom
* **fdisk命令**
> 用于创建分区、删除分区、查看分区信息等操作,fdisk \[-l\] \[device\]
* 硬盘的格式化
> 物理存储设备需要先经过格式化后才能进行分区和使用,格式化实际上是在物理存储设备上重新创建文件系统,即新创建的文件系统取代了旧文件系统的信息。
##### 文件系统的创建与检查(存储空间/外接设备)
* Linux常见文件系统
> ext3/ext4:扩展文件系统(extended),ext3增加了文件系统日志记录功能,称为日志式文件系统(断电后能够根据日志回复文件);
> XFS:SGI开发的高级日志文件系统,健壮、功能丰富、极具伸缩性、是centos7默认的文件系统;centos6采用ext4系统。
> swap:用于Linux的交换分区,是系统运行所必须的分区,使用整个交换分区提供虚拟内存,分区大小通常是物理内存的2倍(由操作系统自行管理该分区);
> vfat:对DOS,Windows系统下FAT文件系统的统称,包括FAT16和FAT32;
> NFS:网络文件系统,用于类Unix系统的网络文件共享;
> ISO9660:光盘采用的标准文件系统;
> 日志文件系统:发展方向;
> proc:作为一种伪文件系统出现,建立在内存的特殊文件系统,挂载点为/proc,记录进程和其它系统信息。
* 文件系统的创建工作主要分为两方面
> * 以设定的**数据块**大小组织储存空间
> > 数据块是分配储存空间的最小单位,数据块单位大小的设置,决定了文件系统的容量,Linux对ext4文件系统默认取4096bytes为数据块大小。
> * 建立索引结点inode表
> > 含义:文件的组成一节提到“文件包括数据和索引两部分,索引包括文件权限、文件主、文件大小、存放位置、建立日期等同一个文件具有相同的inode号。使用ls -i可以查看文件的i节点号”
> > 当格式化完毕后一个文件系统所能够容纳的索引节点数量是固定的。而索引结点的数量基本决定了该文件系统能够创建文件的数量。因此需要根据实际需要设置合适的索引节点数目。
* **mkfs命令**
> 用于创建文件系统,mkfs \[-选项\] <设备文件名>
> 由于mkfs是关于一组命令(mkfs.ext4,mkfs.vfat等)的统一调用入口,因此以下选项只能针对特定文件系统使用,具体可用man手册查询。
> -b <数据块大小>,指定数据块大小(参数可以是1024,2048,4096 bytes)
> -N <索引节点数>,设定创建的索引结点数量,默认值为???
> -c,格式化前检查设备是否有坏数据块
> -t <文件系统类型>,指定要创建的文件系统类型,mkfs支持的文件系统类型包括ext\[2-4\],vfat等。比如windows7,系统默认或推荐采用NTFS,但同时支持FAT32系统。
* **df命令**
> 用于查看当前文件系统的信息,df [-ahlT]
> -a,显示所有文件系统的信息
> -h,以最适容量显示(可读方式)
> -l,只显示本地文件系统的使用情况
> -T,输出每个文件系统类型
> * 常用选项 -hT
* **lsblk命令**
> lsblk是ls block devices的缩写,它提供了一种简单而强大的方式来展示系统中的磁盘和分区信息,使我们能够快速了解磁盘的布局、分区的大小和挂载情况等。
* **lspci命令**
> 该命令可以列出系统中所有的PCI设备信息,包括显卡。 使用命令“lspci | grep VGA”可以只显示显卡信息。
* **fsck命令** (慎用)
> 对文件系统进行检查和错误修复,fsck \[-Af\] \[文件名/挂在路径/设备标签/UUID\]
> -A,根据配置文件/etc/fstab的内容按顺序检查
> -f,强制检查,即使文件系统已被标记为Clean
> * 只有root才能使用,运行前要先将文件系统卸载避免文件系统损坏,千万不能在运行的系统上使用fsck!!!
```
# 查看现有磁盘设备系统分区情况:
fdisk -l
# 对sdb硬盘创建分区等操作
fdisk -/dev/sdb ……
# 查看当前文件的磁盘使用情况
df -hT
# 对sdb1文件系统进行检查(慎用)
fsck /dev/sdb1
```
##### 磁盘文件系统的挂载与卸载
虚拟文件系统:相当于一个应用程序与各种存储设备及其文件系统之间的**接口**,用户在实际使用各种文件系统时并不需要关心文件系统的真实性,而是以统一的接口访问数据。
挂载:用户在使用存储设备之前,必须将该设备中的文件系统,**接入**到Linux虚拟文件系统中,这个过程被称为**挂载(mount)**。
挂载点:文件系统所挂载到的目录称为挂载点(/mnt 主要用于临时挂载文件系统,为某些设备提供默认的挂载点)
手动挂载:对于大多数常见的存储设备,系统可以实现默认方式自动挂载,但一些更为复杂和特定文件系统的挂载和卸载,需要掌握手动挂载命令。
* **mount命令**
> 挂载文件系统,mount \[-t <fs-type>\] \[-o <option>\] 存储设备名 挂载路径
> -t <fs-type>:指定挂载的文件系统类型
> -o <option>:额外制定一些挂在方式,如ro(只读方式),rw(读写方式),default,auto/noauto……
* **umount命令**
> 卸载文件系统,umount [存储设备名/挂载路径]
* 文件自动挂载配置文件 **/ect/fstab**配置文件
> Linux将在初始化时需要挂载的文件系统的相关信息记录在/etc/fstab文件中,将想要在开机挂载的文件系统按格式写入fstab文件中(各字段用逗号隔开),即可实现开机自动挂载。
![22713bf64c9ae24dd7db84c58626b119.png](en-resource://database/650:1)@w=500
```
# 将/dev/sdb1设备挂载到/mnt/new
mount -t ext4 /dev/sdb1 /mnt/new
# 文件系统使用完毕后卸载
umount /dev/sdb1 == umount /mnt/new
```
### 如何进行网络的基础配置
网络中的计算机及相关设备被称为主机
* Windows主机
* Linux主机
![d798dccacb31674e6bddbcb1fb8a47df.png](en-resource://database/651:1)@w=500
**内容**
* IP地址与网络接口
* 查看和操控网络接口的命令
* 学习网络配置相关参数:IP地址、子网掩码、默认网关、DNS服务器地址、主机名
**目标**
* 了解IP地址、子网掩码、网络接口等概念
* 会用ifconfig、ip命令查看和操控网络接口
* 会修改系统配置文件对网络参数进行配置
##### IP地址与网络接口
* IP地址
> 是TCP/IP网络中,用于识别主机的唯一地址。可分为**IPv4**与**IPv6**地址两种
* IPv4地址(较常用)
> 用32位2进制数表示,每8位2进制数为一组,共四组,中间以“.”分隔。
> 表示:将其中每组二进制数换为10进制,其值为0~255。如,192.168.2.5。此格式称为**点分十进制**
> 组成:网络号+主机号(根据网络号与主机号字段的不同可分为A~E五类)
> * **A类**:0网络号(8位),主机号(24位)
> * **B类**:10网络号(16位),主机号(16位)
> * **C类**:110网络号(24位),主机号(8位)
> * D类:1110 多播地址
> * E类:1111 留用
![934bbe72db75d89d39a31cde8861284d.png](en-resource://database/652:1)@w=500
![2f75dc455f2d548168c5299eae0f96ba.png](en-resource://database/653:1)@w=500
* 私有IP地址
> A~C类IP地址划分部分区间为私有IP地址,即不出现在互联网上的IP地址
![74376a9852565e128836bb630707e282.png](en-resource://database/654:1)@w=500
* IP地址的CIDR划分(Classless Inter-Domain Routing)方法
> **网络地址**与**广播地址**:192.168.2.**0**/24,即表示网络号为前24位,后8位为主机号,此处主机号全为0,该编号代表的是整个网络(私有IP);形如192.168.2.**255**/24,主机号全部为1,表示为广播地址,发往改地址的信息实际上将被整个网络所有计算机接受;期间可分配的IP地址为192.168.2.**1**/24~192.168.2.**254**/24
> **回环地址**:整个127.0.0.0/8网络的所有IP地址都被作为回环地址,发往这些地址的信息实际上会被回送至本机(localhost)接收。Linux默认回环地址为127.0.0.1.
* **网络接口**
> Linux提供了ppp(拨号方式链接), wlan(无线连接), **eth**, **lo**等接口。一台计算机可以拥有一至多个网络接口,从而拥有多个IP地址(一块网卡也可以拥有多个IP地址),每个拥有IP地址的网络接口即被视为TCP网络上的一个节点。
> lo网络接口:本地回环接口(local loopback),默认配置的IP地址为127.0.0.1。主要用于本地计算机的内部通讯,也常被用于各种网络和服务器功能的内测(不需网络也可测试网络功能)。
> eth网络接口:以太网卡,标识为ethN(N=0,1,2……)。此外还有enoN,ensN,enpN型网卡,前段的en均表示以太网,后接一个字母表示网卡类型。
> 网络接口获取IP地址的方法:静态分配;DHCP服务器动态分配
##### 接口查看管理命令
* 不同计算机系统由于使用的网络套件不同,管理接口的命令有区别,主要有两类套件可以使用
* ifconfig命令: net-tools套件
> 用于查看、设置、启动或关停某个网络接口。ifconfig \[接口\] \[IP地址\] \[netmask掩码\] \[up/down\],其中up/down对应于启动/关停对应接口。
> 利用yum install net-tools,安装套件
> ifconfig -a,查看系统中所有安装好的网络接口
> ifconfig enp0s3,查看特定网络接口(网卡)的配置情况
> ifconfig enp0s3 down/up,关闭/启动特定网络接口
> ifconfig enp0s3 192.168.2.10 up,为网卡配置ip地址
> ifconfig enp0s3 192.168.2.10 netmask 255.255.255.0,重新配置ip地址和子网掩码(新的ip地址是临时的,在重启网络服务后将失效)
* ip命令: iproute2套件
> ip命令用于显示Linux主机的路由、网络设置、策略路由和隧道等,功能较ifconfig命令更加强大。ip [-选项] OBJECT [命令 [指令]]
> * Object:可选link、address两类,前者用于查看和设置**网络设备**信息,后者用于查看和设置设备的**协议地址**有关信息。
> * 选项:-s,显示该设备的统计数据(statistic)
> * 详情打开手册查看
> ip [-a] link show,查看相关网络设备(详细)信息
> ip link set \[device] \[动作参数]
![5e1798dfc90344020f49920544468d1f.png](en-resource://database/655:1)@w=500
##### 网络配置参数
如何为Linux系统配置网络参数:IP,子网掩码,默认网关,DNS服务器地址,主机名
![ff63f9cf931389d6fe4d54d6e7bdbcae.png](en-resource://database/656:1)@w=300
图形界面方法:应用程序>系统工具>设置>网络
tty界面配置工具为NetworkManager Text User Interface,即nmtui。
> yum install NetworkManager-tui
> systemctl start NetworkManager
* 编辑配置文件的方法修改网络配置参数
![3571a7b5c8b424b8f1b9afd40c52673b.png](en-resource://database/657:1)@w=500
![2102e0335c2edee2d0f4f83c7108b799.png](en-resource://database/658:1)@w=500