一.基本概要
import React from 'react';
import img from '../../assets/linux/linux-perf-tools-full.png';
export default () => <img alt="Linux Performance Tools" src={img} width="900" />;
1.1抽象级别和层次
最底层是硬件系统,包括内存和中央处理器(用于计算和从内存中读写数据),此外硬盘和网络接口也是硬件系统的一部分。
硬件系统之上是 内核,它是操作系统的核心。内核是运行在内存中的软件,它向中央处理器发送指令。内核管理硬件系统,是硬件系统和应用程序之间进行通信的接口。
进程 是指计算机中运行的所有程序,由内核统一管理,它们组成了最顶层,称为 用户空间。
import React from 'react';
import img from '../../assets/linux/linux-level.png';
export default () => <img alt="Linux Level" src={img} width="640" />;
内核和用户进程之间最主要的区别是:内核在 内核模式(kernel mode)中运行,而用户进程则在 用户模式(user mode)中运行。在内核模式中运行的代码可以不受限地访问中央处理器和内存,这种模式功能强大,但也非常危险,因为内核进程可以轻而易举地使整个系统崩溃。那些只有内核可以访问的空间我们称为 内核空间(kernel space)。
1.2硬件系统
主内存(main memory)或许是所有硬件系统中最为重要的部分。基本上来讲,主内存存储 0
和 1
这样的数据。我们将每个 0
和 1
称为一个比特(或位,bit)。内核和进程就在主内存中运行,它们就是一系列比特的大合集。所有外围设备的数据输入和输出都通过主内存完成,同样是以一系列 0
和 1
的形式。中央处理器像一个操作员一样处理内存中的数据,它从内存读取指令和数据,然后将运算结果写回内存。
1.3内核
Linux 系统的核心是 内核。内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件,并根据需要执行软件。
内核主要负责管理以下四种功能:
- 进程管理:内核决定哪个进程可以使用 CPU
- 内存管理:内核管理所有的内存,为进程分配内存,管理进程间的共享内存以及空闲内存
- 设备驱动程序和设备管理:作为硬件系统(如磁盘)和进程之间的接口,内核负责操控硬件设备
- 系统调用和系统支持:进程通常使用系统调用和内核进行通信
系统调用和系统支持
内核还对用户进程提供其他功能。例如,系统调用(system call 或 syscall)为进程执行一些它们不擅长或无法完成的工作。打开、读取和写文件这些操作都涉及系统调用。
-
fork
: -
exec
:
系统内存管理
操作系统内核的主要功能之一就是内存管理。内核不仅管理服务器上的可用物理内存,还可以创建和管理虚拟内存(即实际并不存在的内存)。
内核通过硬盘上的存储空间来实现虚拟内存,这块区域称为 交换空间(swap space)。内核不断在交换空间和实际的物理内存之间反复交换虚拟内存中的内容。
软件程序管理
Linux 操作系统将运行中的程序称为进程。
内核创建了第一个进程(称为 init
进程)来启动系统上所有其他进程。当内核启动时,它会将 init
进程加载到虚拟内存中。内核在启动任何其他进程时,都会在虚拟内存中给新进程分配一块专有区域来存储该进程用到的数据和代码。
硬件设备管理
任何 Linux 系统需要与之通信的设备,都需要在内核代码中加入其驱动程序代码。驱动程序代码相当于应用程序和硬件设备的中间人,允许内核与设备之间交换数据。在 Linux 内核中有两种方法用于插入设备驱动代码:
- 编译进内核的设备驱动代码
- 可插入内核的设备驱动模块
Linux 系统将硬件设备当成特殊的文件,称为设备文件。设备文件有三种分类:
- 字符型设备文件:指处理数据时每次只能处理一个字符的设备(大多数类型的调制解调器和终端都是作为字符型设备文件创建);
- 块设备文件:指处理数据时每次能处理大块数据的设备,比如硬盘;
- 网络设备文件:指采用数据包发送和接收数据的设备,包括各种网卡和一个特殊的回环设备。这个回环设备允许 Linux 系统使用常见的网络编程协议同自身通信。
Linux 为系统上的每个设备都创建一种称为 节点 的特殊文件。与设备的所有通信都通过设备节点完成。每个节点都有唯一的数值对供 Linux 内核标识它。数值对包括一个主设备号和一个次设备号。类似的设备被划分到同样的主设备号下。次设备号用于标识主设备组下的某个特定设备。
文件系统管理
Linux 内核支持通过不同类型的文件系统从硬盘中读写数据。
Linux 内核采用虚拟文件系统(Virtual File System,VFS)作为和每个文件系统交互的接口。这为 Linux 内核同任何类型文件系统通信提供了一个标准接口。当每个文件系统都被挂载和使用时,VFS 将信息都缓存在内存中。
二.常见目录
Linux 将整个文件系统看作一棵树,这棵树的树根叫做根文件系统,用 /
表示。
常用的系统文件目录
目录 | 语义 | 描述 |
---|---|---|
/root | Root Directories | 系统管理员的主目录 |
/home/username | Home Directories | 普通用户的主目录 |
/bin | User Binaries | 供所有用户使用的完成 基本维护任务的命令
|
/sbin | System Binaries | 存放系统管理员使用的 管理程序命令
|
/lib | System Libraries | 系统最基本的 共享链接库和内核模块
|
/etc | Configuration Files | 系统和应用软件的 配置文件
|
/tmp | Temporary Files | 临时文件的存放目录 |
/proc | Process Information | 虚拟文件系统 |
/var | Variable Files | 存放在系统 运行时可能会更改的数据
|
/usr | Unix Software Resource | Unix 操作系统软件资源所放置的目录,而非用户的数据 |
/usr
不是 user
的缩写,其实 usr
是 Unix Software Resource,也就是 Unix 操作系统软件资源所放置的目录,而非用户的数据;所有系统默认的软件都会放置到 /usr
,系统安装完时,这个目录会占用最多的硬盘容量。
目录 | 语义 | 描述 |
---|---|---|
/usr/bin | 用户需要执行的命令,例如压缩、文件查找、客户端等程序 | |
/usr/sbin | 系统运行不必须的命令,例如服务端程序、用户管理等程序 | |
/usr/include | C / C++ 头文件 | |
/usr/lib | 普通用户使用的库文件 | |
/usr/local | 个人安装的软件,通常需要手动指定;与 /usr 目录的目录结构相似 |
|
/usr/libexec | ||
/usr/share | ||
/usr/standalone |
其他文件目录
目录 | 语义 | 描述 |
---|---|---|
/boot | Boot Loader Files | 启动 Linux 时的核心文件 |
/dev | Device Files | 所有 Linux 的外围设备 |
/lost+found | 无家可归文件的避难所 | |
/mnt | Mount Directory | 空目录,用于提供给用户临时挂接别的文件系统 |
/opt | Optional add-on Apps | 第三方工具使用的安装目录 |
/srv | Service Data | |
/media | Removable Devices |
虚拟文件系统
/proc
目录挂载了一个虚拟文件系统,以虚拟文件的形式映射系统与进程在内存中的运行时信息。
系统信息
/proc
下的直接子目录通常存储系统信息。
目录 | 描述 | 举例 |
---|---|---|
/proc/cpuinfo | 处理器的相关信息 | physical id、cpu cores、siblings、processor |
/proc/version | 系统的内核版本号 | Linux version 3.10. |
进程信息
重点是 /proc/
目录映射的进程信息。以
目录 | 描述 |
---|---|
/proc/<pid>/cmdline |
启动当前进程的完整命令 |
/proc/<pid>/cwd |
当前进程工作目录的软链 |
/proc/<pid>/environ |
当前进程的环境变量列表 |
/proc/<pid>/exe |
启动当前进程的可执行文件的软链 |
/proc/<pid>/fd |
目录,保持当前进程持有的文件描述符(以软链形式存在,指向实际文件) |
/proc/<pid>/limits |
当前进程使用资源的软限制、硬限制(和单位) |
/proc/<pid>task |
目录,保存当前进程所运行的每一个线程的相关信息; 以 <tid> 作为各线程的目录名,目录结构与 /proc/<pid> 相似 |
数据文件系统
/var
目录存放数据文件,如程序数据、日志等;但线上通常只将日志放在 /var
目录。
通过 rsyslog 记录系统级日志,配置文件为 /etc/rsyslog.conf
。重点看 /var/log/messages
的配置:
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
*.info
表示所有服务大于等于 info 优先级的信息都会记录到/var/log/messages
中;mail.none
表示不记录任何 mail 的信息到/var/log/messages
中。
以上配置表示:除安全认证、邮件、定时任务外,输出到 stdout、stderr 的 info 及更高级别的日志记录在 /var/log/messages
中。
三.进程
- 进程的概念与进程查看
- 进程的控制命令
- 进程的通信方式
- 守护进程和系统日志
- 服务管理工具
- SELinux 简介
进程的概念
进程——运行中的程序,从程序开始运行到终止的整个生命周期是可管理的
C 程序的启动是从 main
函数开始的
int main(int agrc, char * argv[])
终止的方式并不唯一,分为正常终止和异常终止:
- 正常终止也分为从
main
返回、调用exit
等方式 - 异常终止分为调用
about
、接收信号等
进程的创建需要继承父进程,Linux 中的第一个进程由系统创建,pid
为 1,主要用作引导用户空间服务。
程序有时候需要处理并发的任务,他可能启动一个进程,把一个进程里面分成不同的线程处理。当计算机资源不充足的时候,可以查看是否进程或线程过多导致的问题发生。
进程通信
进程的通信方式——信号,信号是进程间通信方式之一,典型用法是:终端用户输入终端命令,通过信号机制停止一个程序的运行。
守护进程
使用 nohup 与 & 富豪配合运行一个命令
nohup
命令使进程忽略 hangup
(挂起)信号
守护进程(daemon)和一般进程有什么差别呢?
使用 screen
命令
孤儿进程,孤儿进程必须被 1 号进程收留。
四.文件权限
查看文件权限的方法
# 在某个有文件存在的目录下输入以下命令
ll
drwxr-xr-x 7 root root 4096 May 7 00:50 app
-rw------- 1 root root 1679 Jun 24 22:57 github
-rw-r--r-- 1 root root 1376 Jul 20 2019 index.html
类型 权限 所属用户和组 文件名
文件类型
类型第一个字符表示文件的类型,常用的有 -
普通文件,d
目录文件
-
-
:普通文件 -
d
:目录文件 -
b
:块特殊文件 -
c
:字符特殊文件 -
l
:富豪链接 -
f
:命名管道 -
s
:套接字文件
不同的文件类型,文件权限对应不同的功能。
文件权限的表示方法
- 字符权限表示方法
-
r
读 -
w
写 -
x
执行
-
- 数字权限的表示方法(二进制)
- r = 4
- w = 2
- x = 1
-rw-r-xr-- 1 username groupname mtime filename
-
rw-
:文件属主的权限 -
r-x
:文件属组的权限 -
r--
:其他用户的权限
创建新文件有默认权限,根据 umask 值计算,属主和属组根据当前进程的用户来设定。
目录权限的表示方法
-
x
:进入目录 -
rw
:显示目录内的文件名 -
wx
:修改目录内的文件名
特殊权限
- SUID:用于二进制可执行文件,执行命令时取得文件属主权限,如
/usr/bin/passwd
- SGID:用于目录,在该目录下创建新的文件和目录,权限自动更改为该目录的属组
- SBIT:用于目录,该目录下新建的文件和目录,仅 root 和自己可以删除,如
/tmp
五.防火墙
添加端口到防火墙
firewall-cmd --zone=public --add-port=你的端口/tcp permanet
systemctl restart firewalld.service
基本操作
3.配置 firewalld-cmd
- 查看版本: firewall-cmd --version
- 查看帮助: firewall-cmd --help
- 显示状态: firewall-cmd --state
- 查看所有打开的端口: firewall-cmd --zone=public --list-ports
- 更新防火墙规则: firewall-cmd --reload
- 查看区域信息: firewall-cmd --get-active-zones
- 查看指定接口所属区域: firewall-cmd --get-zone-of-interface=eth0
- 拒绝所有包:firewall-cmd --panic-on
- 取消拒绝状态: firewall-cmd --panic-off
- 查看是否拒绝: firewall-cmd --query-panic
开启端口
# 添加
firewall-cmd --zone=public --add-port=80/tcp --permanent (--permanent 永久生效,没有此参数重启后失效)
# 重新载入
firewall-cmd --reload
# 查看
firewall-cmd --zone= public --query-port=80/tcp
# 删除
firewall-cmd --zone= public --remove-port=80/tcp --permanent
设置端口
Ali 阿里云有防火墙文章来源:https://www.toymoban.com/news/detail-839590.html
开放新端口文章来源地址https://www.toymoban.com/news/detail-839590.html
- 实例安全组添加端口
- 服务器添加新端口到防火墙配置中
# 对外开放端口
firewall-cmd --permanent --add-port=8080-8085/tcp
# 重载端口
firewall-cmd --reload
# 删除端口
firewall-cmd --permanent --remove-port=8080-8085/tcp
# 查看防火墙开放端口
firewall-cmd --permanent --list-ports
# 查看使用互联网的服务
firewall-cmd --permanent --list-services
到了这里,关于【编程向导】Linux-快速入门之基础解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!