Linux 基础
1.Linux 基本组成
Linux 系统一般有四个主要部分
- 内核
- shell
- 文件系统
- 应用程序
2.Linux 体系结构
主要分为用户空间与内核空间。 分成这两个空间的原因:从安全的角度他们是隔离的,用户程序崩溃了不会对内核产生影响,从权限的角度,内核空间拥有访问硬件的最高权限,应用程序运行在用户空间,只能看到允许他们看到的地方,以此来确保系统的安全与可靠。
- 用户空间主要包含了应用程序和 C Library(系统封装好的调用库)
- 内核空间主要包括了系统调用层、内核代码、平台架构相关的代码
应用程序与系统硬件通讯,例如发送一个 I/O 请求。使用的是上下文切换,当用户发起请求,系统从用户态转换为内核态,完成之后,从内核态切换回用户态。
- 内核是硬件与软件之间的中间层
- 内核是一个资源管理程序
- 内核提供一组面向系统的命令
图片分成三层,正如前面的结构,图片中底层是文件系统,中间层是进程,上层是命令行交互。每个企鹅都是一个进程,底层中 421 正在对文件系统进行操作。 中层中 171 企鹅处于空闲状态,1341 在守门,他负责 80 这个端口,也就是 http 请求。 21 端口处于一个半掉下来的状态,他是 ftp 端口,处于一个年久失修,比较老旧的状态。 22 端口是 ssh 的端口,这个协议很主流,所以小企鹅很有精神。 217 正在看自己的手表,他是一个定时任务,需要时刻关注时间来查看是否需要做某项工作。 中部,有两个小企鹅扛着管道(PipeLine)在行走,表示进程之间是可以通过管道通讯的。 楼梯口有一个 fs 的标识,可以通过这个楼梯去访问文件管理系统。 最上层有很多的 tty。所有的输入都会通过 tty 交给进程。对输入项进行一些处理最终反馈给用户。
3.Linux 系统结构
3.1 进程管理
进程的特性:
- 进程是正在执行的一个程序或者命令
- 进程有自己的地址空间,占用一定的系统资源
- 一个 CPU 核同一时间只能运行一个进程
- 进程由它的进程 ID(PID)和它的父进程的进程 ID(PPID)唯一识别
3.2 进程调度
进程调度是指操作系统按某种策略或规则选择进程占用 CPU 进行运行的过程。
每一个进程有六种状态。
- R(TASK_RUNNING),可执行状态
- S(TASK_INTERRUPTIBEL),可中断睡眠状态
- D(TASK_UNINTERRUPTIBEL),不可中断的睡眠状态
- T(TASK_STOPPED OR TASK_TRACED),暂停状态或者跟踪状态
- Z(TASK_DEAD-EXIT_ZOMBIE),退出状态,进程成为僵尸进程
- X(TASK_DEAD-EXIT_DEAD),退出状态,进程即将被销毁
调度原则
- 一个 CPU 核同一时间只能运行同一个进程
- 每个进程有近乎相等的执行时间
- 对于逻辑 CPU 而言进程调度使用轮询的方式进行,当轮询完成则回到第一个进程反复
- 进程消耗时间和进程量成正比
3.3 进程的系统调用
3.4 文件系统
文件系统是操作系统中负责管理持久数据的子系统,负责把用户的文件存到磁盘硬件中,持久化的保存文件。 在 Linux 中一切皆文件, 这样做最明显的好处是开发者仅需要使用一套 API 和开发工具即可调取 Linux 系统中绝大部分的资源。举个简单的例子,Linu 中几乎所有读(读文件,读系统状态,读 socket,读 PE) 的操作都可以用 read 函教来进行,几乎所有更改(更改文件,更改系抗参数。写 stcet,写 P)的操作结可以用 id 飞教来进行,使用任何硬件设备都必须与根目录下某一目录执行挂载操作
3.4.1 Linux 文件系统结构
Linux 文件系统是采用树状的目录结构,最上层是/(根)目录。
- /bin: bin 是 Binaries (二进制文件) 的缩写,这个目录存放着最经常使用的命令。
- /boot: 这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。
- /dev: dev 是 Device(设备)的缩写,该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。
- /etc: etc 是 Etcetera(等等)的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。
- /home: 用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
- /lib: lib 是 Library(库)的写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件几乎所有的应用程序都需要用到这些共享库。
- /mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光里的内容了。
- /opt: opt 是 optional (可选)的缩写,这是给主机额外安装软件所摆放的目录,比如你安装一个 ORACLE 数据库则就可以放到这个目录下。默认是空的。
- /proc: proc 是 Process(进程)的写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列将珠文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
- /root: 该目录为系统管理员,也称作超级权限者的用户主目录。
- /sbin: s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件)的缩写,这里存放的是系统管理员使用的系统管理程序。
- /usr: usr 是 unix shared resources(共享资源 的缩写,这是一非常重要的目录,用户的很多应用程宇和文件都放在这目录下,类似于 windows 下的 program fles 目录,
3.4.2 虚拟文件系统
虚拟文件系统(VFS)
- 对应用层提供一个标准的文件操作接口
- 对文件系统提供一个标准的文件接入入口
虚拟文件系统使得 Linux 可以存在多个"实际的文件系统”,比如分区 1 是 ext2,分区 2 是 ext3,分区 3 是 fat32。那么每个“实际的文件系统”的结构和操作方式是不一样的。如果是这样的话用户怎么去操作它们呢? 总不能每种不同的文件系统都采用不同的方法吧,那么这个时候就需要 VFS 作为中间层,用户直接控制 VFS,VFS 再去控制各个文件系统。
3.4.3 文件读取流程
一个完整的 ngnix 读取流程。当 ngnix 接收到一个请求之后,首先会从用户缓存区寻找,以前是否有命中过相关的内容,命中的话,直接从缓存区返回,没有命中的话,会发起一次系统调用(系统 I/O),这时 ngnix 进程从用户态切换到内核态。内核进程则从内核缓冲区中寻找是否命中并缓存过,如果有则从内核缓存拷贝到用户缓存区,并且给用户使用,如果没有的话,则从 DMA 发起请求在磁盘中查找,并且给 CPU 发送指令,让 CPU 从内核缓冲区拷贝到用户缓存区。ngnix 便能读取到数据,之后通过 write 流程,CPU 将内容拷贝到 socket 缓冲区,再从 socket 缓冲区,通过 DMA 发送给用户。 其中 DMA 可以直接与磁盘交互。操作系统增加缓冲区的主要目的便是减少系统的调用,集中调用,节省资源。
3.5 用户权限
为了防止用户的错误修改,导致线上事故,Linux 在文件系统的基础之上又加了一层用户权限。 用户账户
- 普通用户账户:在系统中进行普通作业
- 超级用户账户:在系统中对普通用户和铮哥系统进行管理
组账户
- 标准组:可以容纳多个用户
- 私有组:只有用户自己
3.6 文件权限
文件权限关于用户有三个概念:
- 所有者:文件的所有者
- 所在组:文件的所有者所在的组
- 其他人:除文件所有者及所在组外的其他人
每个用户对于文件都有不同权限,包括读(R)、写(W)、执行(X)
4.Linux 软件包管理
- 软件包 通常指的是一个应用程序,它可以是一个 GUI 应用程序、命令行工具或(其他软件程序需要的)软件库
- 软件包管理:
底层工具:主要用来处理安装和删除软件包文件等任务,DPKG,RPM
上层工具:主要用于数据的搜索任务和任务解析任务,APT,YUM,DNF
底层工具类似于自己找菜回来做,上层工具更像是厨师,我点菜名,上层工具帮我搜索并安装所需要的东西。
- RPM(Red Hat Package Manager),为 Red hat 操作系统的包管理系统
- DPKG(Debian package),为 Debian 操作系统的包管理系统
操作系统 格式 软件包管理系统 前端工具 Debian .deb dpkg apt,apt-get Ubuntu .deb dpkg apt,apt-get CentOS .rpm rpm yum Fedora .rpm rpm dnf openSUSE .rpm rpm zypper
5.Linux 命令行总结
这节课里命令行讲的内容很多,我干脆都放到这里了,方便查找
-
查看 Linux 系统内核版本
# 方法一 uname -a # Linux VM-16-17-ubuntu 5.4.0-121-generic #137-Ubuntu SMP Wed Jun 15 13:33:07 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux # 方法二 cat /proc/version # Linux version 5.4.0-121-generic (buildd@lcy02-amd64-013) (gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)) #137-Ubuntu SMP Wed Jun 15 13:33:07 UTC 2022 # 方法三 cat /etc/os-release # NAME="Ubuntu" # VERSION="20.04 LTS (Focal Fossa)" # ID=ubuntu # ID_LIKE=debian # PRETTY_NAME="Ubuntu 20.04 LTS" # VERSION_ID="20.04" # HOME_URL="https://www.ubuntu.com/" # SUPPORT_URL="https://help.ubuntu.com/" # BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" # PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" # VERSION_CODENAME=focal # UBUNTU_CODENAME=focal -
查看进程信息
# 查看启动的ngnix进程 ps aux | grep nginx # root 93824 1 0 16:42 ? 00:00:00 nginx: master process /usr/sbin/nginx # 查看某个进程 top -p pid # PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 32632 5248 4572 S 0.0 0.0 0:00.02 nginx # 关闭pid的进程 kill pid # 全部进程动态实时视图,类似于任务管理器 top -
查看文件系统类型
# df 命令报告文件系统磁盘空间利用率 df -T # Filesystem Type Size Used Avail Use% Mounted on /dev/sda2 ext4 19G 12G 6.3G 65% / # tmpfs tmpfs 491M 0 491M 0% /dev/shm # /dev/sda1 ext4 190M 65M 116M 36% /boot # mount 命令是挂载文件系统用的,不带任何参数运行,会打印包含文件系统类型在内的磁盘分区的信息 mount # /dev/sda2 on / type ext4 (rw) # proc on /proc type proc (rw) -
文件的基本操作
ls # 查看文件夹下内容 mkdir demo # 创建文件夹 mv demo /home # 移动 demo 文件夹到 /home rm -r demo # 删除 demo 文件夹 touch file.txt # 创建空文件 cp file.txt file_bak.txt # 复制文件 -
查看用户信息
# 查看当前登录用户信息 w # USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT # xxxx pts/0 fdbd:ff1:ce00:11 14:57 2.00s 0.11s 0.00s w # 查看当前用户所属的组 groups # xxxx tiger admin # 查看用户的 uid 信息 id xxxx # uid=1001(xxxx) gid=1001(xxxx) groups=1001(xxxx),1000(tiger),2001(admin) -
用户权限操作
# 在根目录创建一个文件夹,查看当前用户拥有文件夹的权限 cd / $$ mkdir demo $$ ls -ld demo sudo useradd ceshi # 创建一个用户,并赋予可写操作 sudo passwd ceshi # 设置用户密码 su ceshi # 切换ceshi用户登录 cd demo #进入demo文件夹 touch index.js # 创建index.js文件,提示无权限,需要给ceshi用户demo文件夹权限 sudo chown -R ceshi:ceshi ./demo # demo文件夹权限给ceshi用户 su ceshi cd demo touch index.js # 创建成功
个人感悟
说实话上了两天课,其实会的很少,所以有点走神,选择了用写笔记来强迫自己学习的方法。不知道md文件和这里语法的一些区别,写的不好,如果你看到了这里还请你见谅,我会继续努力的。加油!