1. Linux内核

Linux: 一切皆文件
Linux 的内核主要由 5 个子系统组成:进程调度、内存管理、虚拟文件系统、网络接口、进程间通信
WP5UzT.md.jpg

1.1进程调度

进程调度指的是系统对进程的多种状态之间转换的策略。Linux 下的进程调度有 3 种策略:SCHED_OTHER、SCHED_FIFO 和 SCHED_RR。

  1. SCHED_OTHER:分时调度策略(默认),是用于针对普通进程的时间片轮转调度策略。
  2. SCHED_FIFO:实时调度策略,是针对运行的实时性要求比较高、运行时间短的进程调度策略
  3. SCHED_RR:实时调度策略,是针对实时性要求比较高、运行时间比较长的进程调度策略。
1.2 内存管理 MMU

内存管理是多个进程间的内存共享策略。在 Linux 中,内存管理主要说的是虚拟内存。MMU主要工作是通过虚拟内存映射到物理内存.

1.3 虚拟文件管理 VFS

在 Linux 下支持多种文件系统,如 ext、ext2、ext3、minix、umsdos、msdos、vfat、ntfs、proc、smb、ncp、iso9660、sysv、hpfs、affs 等。

1.4 网络接口

网络接口分为网络协议和驱动程序,网络协议是一种网络传输的通信标准,而网络驱动则是对硬件设备的驱动程序。Linux 支持的网络设备多种多样,几乎目前所有网络设备都有驱动程序

1.5 进程通信

Linux 操作系统支持多进程,进程之间需要进行数据的交流才能完成控制、协同工作等功能,Linux 的进程间通信是从 UNIX 系统继承过来的。Linux 下的进程间的通信方式主要有管道、信号、消息队列、共享内存和套接字等方法。

2. 目录结构

Wi84JK.md.png
bin: binary, 二进制文件目录,存储了可执行程序,今天要将的命令对应的可执行程序都在这个目录中
sbin: super binary, root 用户使用的一些二进制可执行程序
etc: 配置文件目录,系统的或者用户自己安装的应用程序的配置文件都存储在这个目录中
lib: library, 存储了一些动态库和静态库,给系统或者安装的软件使用
media: 挂载目录,挂载外部设备,比如:光驱,扫描仪
mnt: 临时挂载目录,比如我们可以将 U 盘临时挂载到这个目录下
proc: 内存使用的一个映射目录,给操作系统使用的
tmp: 临时目录,存放临时数据,重启电脑数据就被自动删除了
boot: 存储了开机相关的设置
home: 存储了普通用户的家目录,家目录名和用户名相同
root: root 用户的家目录
dev: device , 设备目录,Linux 中一切皆文件,所有的硬件会抽象成文件存储起来,比如:键盘,鼠标
lost+found: 一般时候是空的,电脑异常关闭 / 崩溃时用来存储这些无家可归的文件,用于用户系统恢复
opt: 第三方软件的安装目录
var: 存储了系统使用的一些经常会发生变化的文件, 比如:日志文件
usr: unix system resource, 系统的资源目录
usr/bin: 可执行的二进制应用程序
usr/games: 游戏目录
usr/include: 包含的标准头文件目录
usr/local: 和 opt 目录作用相同,安装第三方软件

3. 命令解析器 shell & bash

命令解析器在 Linux 操作系统中就是一个进程 (运行的应用程序), 它的名字叫做 bash 通常我们更习惯将其称之为 shell (即: sh)。他们之间的渊源是这样的,在 Unix 操作系统诞生之后一个叫伯恩 (Bourne) 的人为其编写了命令解析器取名为 shell, Linux 操作系统诞生之后伯恩再次改写了 shell (sh), 将其称之为 bash (Bourne Again SHell), bash 就是 sh 的增强版本。

在 Linux 操作系统中默认使用的命令解析器是 bash, 当然也同样支持使用 sh。当用户打开一个终端窗口,并输入相关指令, 按回车键, 这时候命令解析器就开始工作了, 具体步骤如下:

  1. 在 Linux 中有一个叫做 PATH 的环境变量,里边存储了一些系统目录 (windows也有, 叫 Path).
  2. 命令解析器需要依次搜索 PATH 中的各个目录,检查这些目录中是否有用户输入的指令
    1. 如果找到了,执行该目录下的可执行程序,用户输入的命令就被执行完毕了
    2. 如果没有找到,继续搜索其他目录,最后还是没有找到,会提示命令找不到,因此无法被执行

4. 命令提示行

1
root@qpwlkq-VirtualBox:/#

qpwlkq-VirtualBox: 主机名
root: 用户名
#: 表示当前用户是root永华
$: 表示当前用户是普通用户
~: 在当前用户的家目录中

5. 命令行快捷键

Tab: 命令自动补齐
Ctrl+p(↑): 显示输入的上一个历史命令
Ctrl+n(↓): 显示输入的下一个历史命令
Ctrl+a(home): 光标移动命命令行首
Ctrl+e(end): 光标移动命命令行尾
Ctrl+u: 删除光标前的部分字符串
Ctrl+k: 删除光标后的部分字符串
Backspace/Delete: 删除光标前 / 后的一个字符

6. 文件管理命令

6.1 cd

进入指定目录:

1
$ cd 目录名(相对地址/绝对地址)

后退回上一级目录

1
$ cd ..

进入当前用户根目录

1
2
3
$ cd                    # 方式1
$ cd ~ # 方式2
$ cd /home/用户名 # 方式3

最近使用的两个文件夹互相切换

1
$ cd -
6.2 mkdir
1
2
3
4
5
# 单层目录
$ mkdir 新目录的名字

# 多层目录, 需要加参数 -p
$ mkdir parent/child/baby1/baby2 -p
6.3 rmdir/rm

rmdir: 只能删除空目录,有点 low,不好用
rm: 可以删除文件也可以删除目录,如果删除的的是目录,需要加参数 -r, 意思是递归 (recursion).
rm -i: 删除的时候给出提示
rm -f: 强制删除文件, 没有提示直接删除, 并且不能恢复

6.4 cp

拷贝文件: 文件B存在就被覆盖, 不存在就新建.

1
$ cp 文件A 文件B

拷贝目录: 拷贝目录需要参数 -r, 目录B不存在就新建

1
2
3
4
5
6
7
8
9
# 场景1: 目录A, 通过拷贝得到不存在的目录B
$ cp 目录A 目录B -r

# 场景2: 目录A存在的, 目录B也是存在的, 执行下边的拷贝 ==> 目录A会被拷贝并将其放到目录B中
$ cp 目录A 目录B -r

# 场景3: 把A目录里的某一个或者多个文件拷贝到B目录中
$ cp A/a.txt B # 拷贝 A目录中的 a.txt 到目录B中
$ cp A/* B -r # 拷贝 A目录中的所有文件到目录B中, 不能确定A目录中是否有子目录, 因此需要加 -r
6.5 mv
  • 文件的移动:
    1
    2
    3
    4
    # 语法: mv 要移动的文件  目录
    # 有一个文件A, 移动到目录B中
    # 其中A可以是文件也可以是目录, B必须是目录而且必须是存在的
    $ mv A B
  • 文件改名:
    1
    2
    3
    # 语法: mv 要改名的文件  新名字(原来是不存在的,这点很重要)
    # 其中A可以是文件也可以是目录,并且是存在的, B原来是不存在的
    $ mv A B
  • 文件覆盖:
    1
    2
    3
    4
    # 语法: mv 存在文件A  存在的文件B
    # 其中A是文件(非目录)并且是存在的, B也是一个文件(非目录)并且也存在
    # A文件中的内容覆盖B文件中的内容, A文件被删除, 只剩下B文件
    $ mv A B
    6.6 查看文件内容
  • cat: 将文件内容显示到终端
  • more: 比cat高级一点, 可以以翻屏(空格↑空格↓)的方式查看文件中的内容
  • less: 类似more
  • head: 默认前10行, -行数 可以指定行数
  • tail: 默认后10行, -行数 可以指定行数
6.7 链接的创建
  • 软连接: 软连接相当于 windows 中的快捷方式
    1
    $ ln -s 源文件路径 软链接文件的名字(可以带路径)
  • 硬链接: 硬链接相当于起别名, 硬链接计数加一
    1
    $ ln 源文件(非目录) 硬链接文件的名字(可以带路径)
6.8 修改文件的权限
  • 文字设定法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #chmod
    # 语法格式: chmod who [+|-|=] mod 文件名
    - who:
    - u: user -> 文件所有者
    - g: group -> 文件所属组用户
    - o: other -> 其他
    - a: all, 以上是三类人 u+g+o
    - 对权限的操作:
    +: 添加权限
    -: 去除权限
    =: 权限的覆盖
    - mod: 权限
    r: read, 读
    w: write, 写
    x: execute, 执行
    -: 没有权限
  • 数字设定法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 语法格式: chmod [+|-|=] mod 文件名
    - 对权限的操作:
    +: 添加权限
    -: 去除权限
    =: 权限的覆盖, 等号可以不写
    - mod: 权限描述, 所有权限都放开是 7
    - 4: read, r
    - 2: write, w
    - 1: execute , x
    - 0: 没有权限

    # 分解: chmod 0567 a.txt

    0 5 6 7
    八进制 文件所有者 文件所属组用户 其他人
    r + x r + w r+w+x
    修改文件所有者/所属组
    1
    2
    3
    4
    5
    # 语法1-只修改所有者: 
    $ sudo chown 新的所有者 文件名

    # 语法2-同时修改所有者和所属组:
    $ sudo chown 新的所有者:新的组名 文件名
其他
  1. tree命令
    ubuntu: sudo apt install tree
    centos: sudo yum install tree
    tree [-L n] 显示多少层
  2. pwd命令
    查看工作目录
  3. touch命令
    创建新的文件, 如果文件已存在, 更新文件的修改日期
  4. which命令
    查看要执行的命令所在的实际路径
  5. 重定向命令
    1. >: 将文件内容写入到指定文件中,如果文件中已有数据,则会使用新数据覆盖原数据
    2. >>: 将输出的内容追加到指定的文件尾部

1.3 用户管理命令 ls

1
2
3
$ ls [args]         # 查看当前目录
$ ls [args] 目录名 # 查看指定目录
$ ls [args] 文件名 # 查看某个文件的信息
参数1: -a
1
$ ls -a   #显示所有文件包括隐藏文件, 前面加'.'的是隐藏文件
参数2: -l
1
$ ls -l   #显示文件的详细信息
参数3: -F
1
$ ls -F   #区分文件和文件夹, 文件夹后面跟'/'
参数4: -h
1
$ ls -lh  #人性化表示, 文件大小不用字节数量表示, 转换为K等单位
其他
1
2
$ ls -laF #可以用ll表示
$ ll

文件类型

WiDli4.md.png

-: 普通文件, 在linux终端中, 没有执行权限的为白色, 压缩包为红色, 可执行程序为绿色.
d: 目录, 在linux终端中显示为蓝色, 如果目录的所有权限都是开放的, 有绿色的背景色
l: 软连接文件,相当于Windows中的快捷方式, 在linux中显示为淡蓝色.
c: 字符设备, 亮黄色.
b: 块设备, 亮黄色
p: 管道文件, 棕黄色
s: 本地套接字文件, 粉色

用户类型

三种类型都可能有部分权限

  1. 文件所有者
  2. 文件所属组用户
  3. 其他人
属性1: 文件访问权限

抽出某一条分析:

1
drwxr-xr-x 3 qpwlkq qpwlkq 4096 7月 8 15:03 tinyhttpd-0.1.0/

第一个字符表示文件类型, 后面的9字符表示用户对该文件的操作权限, 9个字符分三份, 前三个表示拥有者权限,中间三个表示文件所属组用户的权限, 后三个表示其他人的权限
r: 读权限
w: 写权限
x: 执行权限
-: 没有任何权限

属性2: 硬链接计数

有多少别名, 共同指向磁盘上的同一块内存

属性3: 文件的所有者
属性4: 用户所属组

每个用户默认自己一组(但可以通过操作让多用户一组).

属性5: 文件/目录大小

注意: 对于一个目录来说, 仅表示这个目录所占的空间大小, 而不包括目录内的文件大小.

属性6: 日期

表示文件的修改日期