Systems Performance Enterprise and the Cloud v2
性能分析相关的术语
以下为性能分析中常用到的专业术语或指标 [2]
IOPS
Input/Output Operations Per Second. 用于衡量数据传输操作(Rate of Data transfer operations)的频率。对于硬盘 I/O (Disk I/O)来说,指 每秒发生的读写请求 。Throughput
吞吐量 。在网络通信中,主要指 数据传输速率(Data Rate, bytes/bits per second) 。在其他上下文(Contexts,如 Databases),Throughput 通常指 Operation Rate(Operations Per Second or Transactions Per Second)Response Time
响应时间 。一个操作执行到结束的时间。这通常包括 请求等待时间(Waiting Time) 、 被服务时间(Serviced Time) 、 传输时间(Transfer Time)Latency
延迟 。可以指某个操作(Operation)消耗在 等待被处理/服务(Time Waiting to be Serviced/Processed)的时间 。在某些上下文中,等同于 Response Time 。Utilization
使用率 。衡量资源的忙的程度。Saturation
衡量一个资源(如 CPU)的待处理队列中未处理的任务数量。Bottleneck
Workload
一般是客户端请求Cache
SUT
System Under Test 。性能测试目标Off-CPU
Off-CPU 指的是当前不在 CPU 上运行的程序的一种状态。比如在性能分析过程中,需要分析当前不在 CPU 上运行的 Process/Threads 所处的状态,通常包括导致 Task 被 Block 的原因:Disk I/O
、Network I/O
、Lock Contention
、Explicit Sleeps
、Scheduler Preemption
等
Thread State Analysis
在进行性能分析的过程中,特别是 Application Performance Analysis,首先要清楚 Process/Thread/Task 所处的当前状态,至少可以将其划分为 2 个状态: [8]
- On-CPU
- Off-CPU
更详细的状态划分可以参考以下状态:
User
: On-CPU ,用户模式(User Mode)Kernel
: On-CPU,Kernel 模式Runnable
: Off-CPU,正在等待调度到 CPU(等待变为 On-CPU)Swapping
: Runnable,但是被Page-In
阻塞(Blocked)Disk I/O
: 等待 Block Device I/ONetwork I/O
: 等待网络 I/O,如 Sockets 读/写Sleeping
: 自愿睡眠状态(Voluntary Sleep)Lock
: 等待获取锁Idle
: 等待工作(Waiting for work)
Observability Tools
Linux 系统各个部分相关的监控工具如下图: [3]
Linux Static Performance Tuning Tools:
操作系统导论
本文档中的内容主要源于以下书籍:
Memory
Main Memory
Main Memory 通常是 CPU 可以直接定位和访问的唯一的大存储设备。如果 CPU 要处理磁盘上的数据,数据必须首先被传输到 Main Memory,指令要能被 CPU 执行,也必须首先载入内存中。
Program
要能被运行,首先必须载入到内存中,并提供内存绝对地址给 CPU 以供加载指令和数据。
Logical Memory Address and Virtual Memory Address
通常情况下,CPU 生成的内存地址被称为 Logical Memory Address
,也称为 Virtual Memory Address
。
Memory-address 注册器(memory-address register)加载的地址通常称为 Physical Memory Address
。
程序运行过程中,CPU 操作的是 Virtual Memory Address
,需要由硬件设备 MMU(Memory Management Unit)负责将 Virtual Memory Address space
映射到对应的 Physical Memory Address space
。程序或者是 CPU 运行过程中,不会直接操作(访问/access)物理内存地址空间。
Linux systemd
systemd
是一种用于 Linux 操作系统的系统和服务管理器。它被广泛应用于许多现代 Linux 发行版中,如 CentOS、Fedora、Ubuntu 等。systemd
旨在替代传统的 SysV
和 LSB init
系统,并提供更强大、灵活的系统启动和服务管理功能。
systemd
的关键概念和组件
Unit 文件:
systemd
使用单元(Unit
)文件来描述系统资源。常见的单元类型包括:Service Unit (*.service)
: 用于定义和管理服务。Target Unit (*.target)
: 用于分组和同步一组单元的启动,如multi-user.target
。Timer Unit (*.timer)
: 用于定时任务,相当于cron
的替代品。Socket Unit (*.socket)
:用于管理网络或 IPC 套接字。Mount Unit (*.mount)
: 用于定义挂载点。Path Unit (*.path)
: 监控文件或者目录的变化。当监控的文件或目录发生变化时,可以触发相应的service
单元。
- 单元(
Unit
)文件通常存储在以下目录/etc/systemd/system/
:系统管理员定义的单位文件,优先级较高。/lib/systemd/system/
:发行版提供的单位文件,优先级较低。/run/systemd/system/
:运行时生成的单位文件,临时的。
Target 文件
systemd
使用target
取代传统的运行级别(runlevel
)。常见的目标包括:multi-user.target
: 相当于传统的运行级别 3,支持多用户、无图形界面。graphical.target
: 相当于传统的运行级别 5,支持多用户和图形界面。rescue.target
: 相当于传统的单用户模式,提供基本的系统恢复环境。
日志管理
systemd
使用 `journald` 来管理系统日志。你可以使用journalctl
命令查看日志
服务间的依赖关系
systemd
处理服务间的依赖关系。你可以通过After=
、Before=
、Requires=
等指令在单元文件中定义这些依赖。
systemd
的优势:
- 并行启动:
systemd
可以并行启动服务,减少启动时间。 - 依赖管理 : 能够自动处理服务间的依赖关系,保证系统按需启动服务。
- 日志记录 :
systemd
的日志管理功能强大,提供了统一的接口查看和分析日志。 - 定时任务管理 : 通过
timer
单元文件可以灵活地配置定时任务,作为cron
的替代方案。 - 性能统计数据 :
systemd
启动过程中记录了性能(如服务启动时间)相关的统计数据,可以使用命令 systemd-analyze 查看。
Linux system call
CPU 相关的 syscall 函数
Linux System Call 的帮助文档包含在内核文档中,可以通过 man 2
查看对应的手册,如 man 2 fork
。
system call function | 说明 | 示例 |
---|---|---|
fork |
创建 Processes Linux 中的 fork 是通过封装了 clone 函数实现的 |
内存相关的 syscall
system call function | 说明 | 示例 |
---|---|---|
shm open |
使用 Shared Memory 方式的 IPC 进程使用此方法创建 shared memory ,要相互通信的进程链接到此 FD(File Descripter) |
fd = shm open(name, O CREAT | O RDWR, 0666); |
Prometheus Node exporter 使用
环境信息
- Centos 7
- Prometheus 2.44.0
- node_exporter-1.6.0
node_exporter 安装
以下步骤演示安装 node_exporter
并使用 systemd
管理服务
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.0/node_exporter-1.6.0.linux-amd64.tar.gz |
生成 systemd
服务配置文件 /usr/lib/systemd/system/node_exporter.service
[Unit] |
执行以下命令管理服务
$ systemctl daemon-reload |
node_exporter 配置信息
启动参数详解
参数 | 说明 | 示例 |
---|---|---|
--web.listen-address=":9100" |
node_exporter 监听端口,默认 9100 | |
--web.telemetry-path="/metrics" |
prometheus 获取 Metrics 访问的 url,默认 /metrics |
|
--log.level="info" |
日志级别 | |
--log.format="logger:stderr" |
日志打印格式 | |
--collector.disable-defaults |
关闭默认的采集项 | |
--no-collector.${item} |
关闭某一项默认开启的采集项 | --no-collector.cpu |
--collector.systemd.unit-include="(docker'|'sshd).service" |
收集指定服务的指标 |
可以配置通过正则表达式屏蔽或者选择某些监控项 [1]
参数 | 说明 | 示例 |
---|---|---|
--collector.diskstats.ignored-devices="^(ram'|'loop'|')\\d+$" |
忽略某些磁盘的信息收集 | |
--collector.filesystem.ignored-mount-points="^/(dev'|'proc'|')($'|'/)" |
忽略某些文件系统挂载点的信息收集 | |
--collector.filesystem.ignored-fs-types="^(autofs'|'proc)$" |
忽略某些文件系统类型的信息收集 | |
--collector.netclass.ignored-devices="^$" |
忽略某些网络类的信息收集 | |
--collector.netdev.ignored-devices="^$" |
忽略某些网络设备的信息收集 | |
--collector.netstat.fields="^$" |
配置需要获取的网络状态信息 | |
--collector.vmstat.fields="^(oom_kill'|'pgpg'|'pswp).*" |
配置 vmstat 返回信息中需要收集的选项 |
功能对照表
默认开启的功能
默认开启的功能 [1]
名称 | 说明 | 系统 |
---|---|---|
arp |
从 /proc/net/arp 中收集 ARP 统计信息 |
Linux |
conntrack |
从 /proc/sys/net/netfilter/ 中收集 conntrack 统计信息 |
Linux |
cpu |
收集 cpu 统计信息 | Darwin, Dragonfly, FreeBSD, Linux |
diskstats |
从 /proc/diskstats 中收集磁盘 I/O 统计信息 |
Linux |
edac |
错误检测与纠正统计信息 | Linux |
entropy |
可用内核熵信息 | Linux |
exec |
execution 统计信息 | Dragonfly, FreeBSD |
filefd |
从 /proc/sys/fs/file-nr 中收集文件描述符统计信息 |
Linux |
filesystem |
文件系统统计信息,例如磁盘已使用空间 | Darwin, Dragonfly, FreeBSD, Linux, OpenBSD |
hwmon |
从 /sys/class/hwmon/ 中收集监控器或传感器数据信息 |
Linux |
infiniband |
从 InfiniBand 配置中收集网络统计信息 | Linux |
loadavg |
收集系统负载信息 | Darwin, Dragonfly, FreeBSD, Linux, NetBSD, OpenBSD, Solaris |
mdadm |
从 /proc/mdstat 中获取设备统计信息 |
Linux |
meminfo |
内存统计信息 | Darwin, Dragonfly, FreeBSD, Linux |
netdev |
网口流量统计信息,单位 bytes | Darwin, Dragonfly, FreeBSD, Linux, OpenBSD |
netstat |
从 /proc/net/netstat 收集网络统计数据,等同于 netstat -s |
Linux |
sockstat |
从 /proc/net/sockstat 中收集 socket 统计信息 |
Linux |
stat |
从 /proc/stat 中收集各种统计信息,包含系统启动时间,forks, 中断等 |
Linux |
textfile |
通过 --collector.textfile.directory 参数指定本地文本收集路径,收集文本信息 |
any |
time |
系统当前时间 | any |
uname |
通过 uname 系统调用, 获取系统信息 |
any |
vmstat |
从 /proc/vmstat 中收集统计信息 |
Linux |
wifi |
收集 wifi 设备相关统计数据 |
Linux |
xfs |
收集 xfs 运行时统计信息 | Linux (kernel 4.4+) |
zfs |
收集 zfs 性能统计信息 | Linux |
默认关闭的功能
默认关闭的功能 [1]
名称 | 说明 | 系统 |
---|---|---|
bonding |
收集系统配置以及激活的绑定网卡数量 | Linux |
buddyinfo |
从 /proc/buddyinfo 中收集内存碎片统计信息 |
Linux |
devstat |
收集设备统计信息 | Dragonfly, FreeBSD |
drbd |
收集远程镜像块设备(DRBD)统计信息 | Linux |
interrupts |
收集更具体的中断统计信息 | Linux,OpenBSD |
ipvs |
从 /proc/net/ip_vs 中收集 IPVS 状态信息,从 /proc/net/ip_vs_stats 获取统计信息 |
Linux |
ksmd |
从 /sys/kernel/mm/ksm 中获取内核和系统统计信息 |
Linux |
logind |
从 logind 中收集会话统计信息 |
Linux |
meminfo_numa |
从 /proc/meminfo_numa 中收集内存统计信息 |
Linux |
mountstats |
从 /proc/self/mountstat 中收集文件系统统计信息,包括 NFS 客户端统计信息 |
Linux |
nfs |
从 /proc/net/rpc/nfs 中收集 NFS 统计信息,等同于 nfsstat -c |
Linux |
qdisc |
收集队列推定统计信息 | Linux |
runit |
收集 runit 状态信息 |
any |
supervisord |
收集 supervisord 状态信息 |
any |
systemd |
从 systemd 中收集设备系统状态信息 |
Linux |
tcpstat |
从 /proc/net/tcp 和 /proc/net/tcp6 收集 TCP 连接状态信息 |
Linux |
配置示例
采集白名单配置
关闭默认的采集项,只开启指定的采集项(白名单)
node-exporter --collector.disable-defaults --collector.cpu --collector.meminfo |
BIOS 和 UEFI
计算机启动(上电)后,需要固件(firmware)程序来 初始化硬件 以及选择 需要启动的 Operating System
曾经最流行的固件(firmware)程序是 BIOS(Basic Input Output System),最近 BIOS 正在逐渐被 UEFI(Unified Extensible Firmware Interface)取代。在同一个计算机上,他们只能使用一个(互斥)
UEFI 设计包含安全启动特性(Secure Boot Feature),他可以确保 只有所有组建都进行过有效签名的 OS 才能启动过程中被加载 。此特性也可以禁用以启动未经签名的 OS.
BIOS 或者 UEFI 的主要工作是 初始化硬件 和 并将计算机控制权移交给 Boot Loader ,之后 Boot Loader 会寻找并启动 Operating System.
BIOS 或者 UEFI 通常可以在计算机上电启动后进行配置,一般通过特定的按键(如 F1、F2、F12 等)进入设定界面。主要包含 2 部分内容
- Bios/UEFI 配置工具 : 可以修改 BIOS/UEFI 设定,如启用/禁止某些功能
- Boot Order : 修改启动顺序,如从特定设备(CD、DVD、USB 等)启动
BIOS
BIOS 是位于主板(motherboard)上的一个芯片,负责初始化 CPU(Central Processing Unit)、RAM(Random Access Memory)、PCIE Card(Peripheral Component Interconnect Express Card)和 Network Devices. BIOS 通电后后会立即执行 POST(Power-on self test),确保硬件(CPU、RAM、PCIE、NIC等)配置正确并可正常运行。
- BIOS 仅支持运行于 16 位处理器模式下 ,这限制了任一时刻固件上运行的软件命令(Software Commands)的数量。
- BIOS 为任务运行只分配 1M 内存
- BIOS 运行中的接口和设备(Interfaces and Devices)只能按顺序初始化 ,可能会导致开机缓慢
- BIOS 查找 MBR(Master Boot Record)以确定 OS 的位置并运行 Boot Loader 。MBR 只有 32-bit 的空间用于描述分区(Partitions)的信息,这限制了基于 BIOS 启动的系统,最多支持 4 个主分区(3 个主分区和 1 个逻辑分区),并且分区最大不能超过 2TB.
UEFI
UEFI 最初由 Intel 提出并实现,包括 GPT(Globally Unique Identifier Partition Table),是 UEFI 的一部分。
UEFI 是一个软件(标准)或者说更像是一个微型的系统,用于连接 计算机固件(Computer’s firmware) 和 OS(Operating System) 。UEFI 最终会替代 BIOS 但是向后兼容 BIOS。
UEFI 的功能是通过安装在主板(motherboard)上的特殊固件(firmware)实现的,和 BIOS 一样,其在(生产)出厂之时就已经安装,它是计算机开机(上电)运行的 第一个程序 ,执行和 BIOS 同样的自检(POST)流程,但是它提供了比 BIOS 更多的灵活性 。 UEFI 解决了 BIOS 面临的一些限制,如 最大分区 、 BIOS 执行任务的时间 等
大多数现代化的计算机都已经能同时支持 BIOS 和 UEFI(二选一)。
UEFI 定义了一种新的 OS 和 计算机固件(platform firmware)交流的方式,相比于 BIOS 只能提供 OS 启动过程中必须的信息,UEFI 可以提供更多的特性,如安全启动等。
UEFI 将其初始化数据存放在一个 EFI 分区中,而不是存放在固件(Firmware)中,这个 EFI 分区位于 Nonvolatile Flash Memory ,UEFI 甚至可以在启动时从一个共享网络位置加载。
UEFI 使用比 MBR 更灵活的分区方案,即著名的 GPT(Globally Unique Identifier Partition Table),GPT 使用了 64-bit 用于保留分区表信息,支持多达 128 个分区,并支持系统识别并安装于超过 2TB 的分区之上。
UEFI 能在一个 EFI 系统分区中支持多个 OS,如 Windows OS loader 或者 Debian-based OS loaders,BIOS 只允许存在一个 Boot Loader.
UEFI 是可编程的(Programmable),其相当于一个轻量的 OS.
UEFI 的安全启动(Secure Boot)支持计算机在启动时对其硬件和系统完整性进行校验,可以防止黑客在系统启动时安装 rootkits 并获得系统控制权,Secure Boot 甚至支持授权用户(网络)远程定位问题。
UEFI 包含了一个平台相关(platform-related)的 数据表(data table) ,以及 可以被 OS Loader 调用的 Boot and Runtime Service Calls 。这些信息定义了为支持 UEFI ,固件(Firmwares)或者计算机硬件(Hardwares)应该实现的接口和数据结构(Interfaces and Structures)。
Linux GRUB2
boot loader
在计算机启动的时候决定如何运行(启动)安装于硬盘上的操作系统,GRand Unified Bootloader(GRUB)是 Linux 中最流行的 Bootloader 程序。目前主要有 2 个 GRUB 版本:
- GRUB Legacy : 遗留版本 GRUB v1,在较旧的 Linux 发行版中使用
- GRUB 2 : 当前最新版本,较新的 Linux 发行版中默认的 Bootloader. GRUB 2 的主要功能依旧是 查找并启动已安装在计算机上的操作系统 。同时 通过内嵌了一些工具和配置文件提供了更强大的功能以及灵活性 。
相比于 GRUB Legacy,GRUB 2 有以下优点:
- 脚本支持 。支持脚本语言如 函数 , 循环 , 变量 等
- 模块动态加载(Dynamic Module Loading)
- 救援模式(Rescue Mode)
- 自定义菜单(Custom Menus)
- 主题(Thems)
- 图形化的启动菜单
- 直接从硬盘启动 LiveCD ISO
- 全新的配置文件结构
Non-x86
架构支持,如 PowerPC- 全局 UUIDs 支持
GRUB 2 的配置文件是 /boot/grub/grub.cfg
或者 /boot/grub2/grub.cfg
,关于其配置文件,要注意以下事项:
/boot/grub/grub.cfg
的内容是由工具grub-mkconfig
或者update-grub
根据/etc/default/grub
和/etc/grub.d/
中的内容自动生成,最好不要手动改动/boot/grub/grub.cfg
。要修改控制选项,可以修改/etc/default/grub
和/etc/grub.d/*
,然后使用update-grub
/boot/grub/grub.cfg
的内容会因为 GRUB 2 的包升级(如内核升级导致新增内核或移除内核)而被覆盖,或者用户使用update-grub
命令也会覆盖- 可用的启动内核列表(
/boot/grub/grub.cfg
中的menuentry
)是由命令update-grub
或update-grub2
(一般是grub
的软链接)自动生成 - 用户可以在 OS 启动列表中自定义添加启动条目(menu entry),这个功能一般是通过修改
/etc/grub.d/40_custom
实现 - 控制启动列表显示菜单的选项位于主配置文件
/etc/default/grub
中 - 和 GRUB Legacy 不同,GRUB 2 分区(partitions)编号从 1 开始,而不是 0。但是 硬盘编号 依旧从 0 开始 。如系统上的第一个硬盘的第一个分区,GRUB Legacy 中是
hd(0, 0)
,GRUB 2 中是hd(0, 1)
grub.cfg
中可以包含 Shell 脚本语法,如 函数,循环,变量等- 用于定位内核(Kernels)和
Initial RAM
位置的设备名称,最好是使用更加可靠的 标签(Labels) 或者是 UUIDs(Universally Unique Identifiers) ,而不是类似于/dev/sda
的设备名称,这可以防止计算机系统新增硬盘后,/dev/sda
变成了/dev/sdb
而导致系统启动时内核无法找到。 - 配置文件更改后,只有执行了
update-grub
后才会最终生效
GRUB 2 配置流程
GRUB 2 的配置变更主要是通过修改主配置文件 /etc/default/grub
以及包含自定义脚本文件的目录 /etc/grub.d/
,然后执行 update-grub
最终生效。update-grub
会从 /etc/default/grub
和 /etc/grub.d/
收集相关配置并将其更新到 /boot/grub/grub.cfg
。
启动菜单(Menu Display)的展示行为主要是通过 /etc/default/grub
进行控制 。
linux modules 及 library 相关操作
Linux PAM
PAM(Pluggable Authentication Modules) 由 Sun Microsystems 发明并最初在 Solarise OS 上实现,Linux 于 1997 年实现了 Linux-PAM.
PAM 简化了系统认证管理的过程,使用 PAM 提供了以下好处:
- 使用中心化的方式简化了用户身份认证过程以及系统管理员的视角
- 简化了应用在认证相关功能方面的开发,开发者无需重复写认证相关代码,只需要直接使用已有的认证模块即可
- 认证灵活性
- 可以根据用户身份或者是特定的时间,或者是对特定资源的使用进行允许/拒绝操作
包含 PAM 的应用中 PAM 使用流程大体如下 :
- 一个主体(用户或者进程)请求访问(通过认证)一个应用
- 此应用读取其 PAM 配置文件,其 PAM 配置文件中配置了认证策略,认证策略中一般包含要进行认证的 PAM 模块的列表,这个列表也称为 Stack
- Stack 中配置的 PAM 模块被依次调用
- 每个 PAM 模块会根据其配置返回 成功(Success) 或者 失败(Failure) 状态
- 最后是否认证成功,由所有的 PAM 模块返回的结果组合得到 成功(Success) 或者 失败(Failure) ,具体组合方式取决于配置文件中的配置。
Linux 中,大多数包含 PAM 的应用的配置文件位于 /etc/pam.d/
,通用的 PAM 配置文件格式使用:
context 'control flag' 'PAM module' [module options] |
Linux 中,系统安全(如资源限制,用户登陆等)相关的 PAM 配置文件位于 /etc/security/*.conf
PAM Contexts
PAM 模块为不同的认证服务提供了标准的函数,这些 PAM 模块中的标准函数根据其函数类型称为 Contexts
,也可以叫做 Module Interfaces
或者 Types
,下列出了不同的 PAM Contexts 及其对应的 认证服务(Authentication Service)
Context | Service Description |
---|---|
auth |
提供认证管理服务(Authentication Management Services),如验证帐号密码 |
account |
帐号验证服务(Account Validation Services),例如只允许特定时间登陆 |
password |
管理帐号密码(Manages Account Passwords),如限制帐号密码长度 |
PAM Control Flags
PAM 中的 Control Flags 用于决定返回什么样的状态。下表列出了 PAM 配置中的相关的 Control Flags 及其响应
Control Flag | Response Handle |
---|---|
required |
If failed, returns a failure status to the application, after the rest of the contexts have been run in the stack. For example, a requisite control might cause a login to fail if someone types in an invalid user. But the user might not be told of the failure until after entering a password, hiding the fact that it was the bad username that caused the failure |
requisite |
If failed, returns a failure status to the application immediately without running the rest of the stack 。 (Be careful where you place this control in the stack.) For example, a requisite control might require key-based authentication and fail immediately when a valid key is not provided . In that case, it could fail before even prompting for a username/password. |
sufficient |
- If failed, the module status is ignored. - If successful, then a success status is immediately returned to the application without running the rest of the stack. (Be careful where you place this control in the stack.) |
optional |
This control flag is important only for the final overall return status of success or failure . Think of it as a tiebreaker. When the other modules in the configuration file stack return statuses that are neither clear-cut failure nor success statuses, this optional module’s status is used to determine the final status or break the tie. In cases where the other modules in the stack are returning a clear-cut path of failure or success, this status is ignored. |
include |
Get all the return statuses from this particular PAM configuration file’s stack to include in this stack’s overall return status. It’s as if the entire stack from the named configuration file is now in this configuration file |
substack |
Similar to the include control flag, except for how certain errors and evaluations affect the main stack. This forces the included configuration file stack to act as a substack to the main stack. Thus, certain errors and evaluations affect only the substack and not the main stack. |
PAM Modules
Linux 中,PAM Modules 其实是系统共享库(Shared Library Module)文件,RHEL 默认位于 /usr/lib64/security/pam*.so
, Ubuntu 位于 /usr/lib/x86_64-linux-gnu/security/pam*.so
# ls /usr/lib/x86_64-linux-gnu/security/ |
要查看 PAM Module 的帮助文档,可以使用 man
手册,如 man pam_access
。
使用 PAM 的应用可以大概分为以下 2 类:
普通程序(Application) 。默认使用 PAM 的应用的配置位于
/etc/pam.d
,每个使用 PAM Module 的应用程序都应该有其自己的配置文件来定义它如何使用 PAM 模块。如果没有,这将是一个漏洞,为了防止这种情况出现,系统内置了一个other
的配置(/etc/pam.d/other
),所有使用了 PAM 但是没有指定其配置文件的应用都将使用此配置。other
配置默认拒绝(Implicit Deny)所有的请求# ls /etc/pam.d/
chfn common-auth cron gdm-autologin gdm-smartcard login polkit-1 samba sudo
chpasswd common-password cups gdm-fingerprint gdm-smartcard-pkcs11-exclusive newusers ppp sshd sudo-i
chsh common-session dcv gdm-launch-environment gdm-smartcard-sssd-exclusive other runuser sssd-shadowutils su-l
common-account common-session-noninteractive dcv-graphical-sso gdm-password gdm-smartcard-sssd-or-password passwd runuser-l su vmtoolsd系统安全相关程序 。系统安全相关的 PAM 配置默认位于
/etc/security
。# ls /etc/security/
access.conf faillock.conf limits.conf namespace.conf namespace.init pam_env.conf sepermit.conf
capability.conf group.conf limits.d namespace.d opasswd pwquality.conf time.conf
加密
加密解密相关常用概念 :
- Plain Text : 明文,可以被人类或者激情理解的内容
- Ciphertext : 密文,加密后的内容,一般不能直接被人类或者机器所理解,需要解密
- Encryption : 将
Plain Text
转换为Ciphertext
的过程,通常使用一种加密算法(Encrypt Algorithm) - Decryption : 解密,将
Ciphertext
转换为Plain Text
的过程,通常使用和加密算法(Encrypt Algorithm)相对应的解密算法(Decrypt Algorithms) - Cipher : 加密和解密过程中算法使用的密码。
- Block Cipher : 在对数据进行加密之前,需要首先将其分割成块(Block)
- Stream Cipher : 加密过程中无需将其分割成块(Block)
- Key : 通常值密钥对(公钥/私钥)
以下是一些较为经典的加密算法
Algorithm | Description | |
---|---|---|
AES Advanced Encryption Standard, also called Rijndael |
- Symmetric Cryptography - Block Cipher 。encrypting data in 128- , 192- , 256- , 512- bit, blocks using a 128- , 192- , 256 , or 512 -bit key |
|
Blowfish |
- Symmetric Cryptography - Block Cipher 。encrypting data in 64-bit blocks using the same 32-bit to 448-bit keys for encrypting/decrypting. |
|
CAST5 |
- Symmetric Cryptography - Block Cipher 。 encrypting data in 64-bit blocks using the same up to 128-bit key for encrypting/decrypting. |
|
DES Data Encryption Standard |
已经被认为是不安全的 - Symmetric Cryptography - Block Cipher 。encrypting data in 64-bit blocks using the same 56-bit key for encrypting/decrypting. |
|
3DES |
增强的 DES 加密算法 - Symmetric Cryptography Data is encrypted up to 48 times with three different 56-bit keys before the encryption process is completed. |
|
IDEA |
- Symmetric Cryptography - Block Cipher 。 encrypting data in 64-bit blocks using the same 128-bit key for encrypting/decrypting |
|
RC5 |
- Symmetric Cryptography - Block Cipher 。 encrypting data in 32- , 64-``, or 128- bit blocks ,using the same up to 2,048-bit keys for encrypting/decrypting |
|
RC6 |
- Symmetric Cryptography Same as RC5, but slightly faster |
|
EI Gamal |
- Asymmetric Cryptography Uses two keys derived from a logarithm algorithm |
|
Elliptic Curve Cryptosystems |
- Asymmetric Cryptography Uses two keys derived from an algorithm containing two randomly chosen points on an elliptic curve. |
|
RC4 also called ArcFour or ARC4 |
- Stream Cipher encrypting data in 64-bit blocks using a variable key size for encrypting/decrypting. |
|
RSA |
最流行的非对称加密算法,使用 Public/Private Key 进行加解密- Asymmetric Cryptography |
关于 Hash
Hash 不是加密(Encryption),不像 加密(Encrypt)-解密(decrypt) , 对一个对象进行 Hash 操作后,不可能通过 Hash 后的值 dehash 回原来的对象 。
Hash 算法需要 Collision Free ,即对两个完全不同的输入,经过 Hash 算法后的值也必须 不同 。
在 Linux 系统中,用户名秘密验证就是使用 Hash 算法。/etc/shadow
中包含的是用户密码(加 Salt) Hash 后的值,而不是用户密码,当用户使用密码登陆系统时,会计算用户密码(加 Salt)的 Hash 值并和 /etc/shadow
中保存的内容进行对比以验证用户密码是否正确。
Hash 在 Linux 系统中,有以下用途:
- Passwords 验证
- 校验文件内容
- 数字签名
- 病毒签名
Hash 也有以下叫法:
Message Digest
: 消息摘要,Linux 中常用的命令如md5sum
、sha1sum
、sha224sum
、sha256sum
、sha384sum
、sha512sum
、shasum
等应用了不同的 Hash 算法Checksum
: 校验和Fingerprint
: 数字指纹Signature
: 签名
Hash 常见用途示例
内容完整性校验
例如网上公开的 ISO 系统镜像,发布者会同时发布镜像的 SHA-256 Hash 算法摘要值,当你下载了此镜像后,可以在本地对其镜像同样的 Hash 计算(如 sha256sum
命令),如果计算出的值和发布者公布的值一致,说明其内容和发布者发布的镜像内容一致(未被篡改)
$ sha256sum Fedora-Workstation-Live-x86_64-30-1.2.iso |
Linux auditd 服务
Linux 审计系统提供了一种方式来跟踪系统上与安全相关的信息。根据预配置的规则,审计会生成日志条目,来尽可能多地记录系统上所发生的事件的相关信息。对于关键任务环境而言至关重要,可用来确定安全策略的违反者及其所执行的操作。审计不会为您的系统提供额外的安全,而是用于发现系统上使用的安全策略的违规。可以通过其他安全措施(如 SELinux)进一步防止这些违规。 [1]
以下列表总结了审计可以在其日志文件中记录的一些信息:
- 事件的日期、时间、类型和结果.
- 主题和对象的敏感度标签。
- 事件与触发事件的用户身份的关联。
- 对审计配置的所有修改,以及对访问审计日志文件的尝试。
- 所有身份验证机制的使用,如 SSH 和 Kerberos 等。
- 对任何受信任数据库的修改,如 /etc/passwd。
- 尝试将信息导入系统或从系统导出。
- 根据用户身份、主题和对象标签以及其他属性包含或排除事件。
使用案例
- 监视文件访问
审计可以跟踪文件或目录是否已被访问、修改、执行或者文件的属性是否已改变。例如,这有助于检测对重要文件的访问,并在其中一个文件损坏时提供审计跟踪。 - 监控系统调用
可将审计配置为在每次使用特定系统调用时生成日志条目。例如,这可用于通过监控settimeofday
、clock_adjtime
和其他与时间相关的系统调用来跟踪对系统时间的修改。 - 记录用户运行的命令
审计可以跟踪文件是否已被执行,因此可以定义一个规则以记录每次特定命令的执行。例如,可以对/bin
目录中的每个可执行文件定义一个规则。然后,可以按用户 ID 搜索生成的日志条目,以生成每个用户所执行的命令的审计跟踪。 - 记录系统路径名称的执行
除了观察在规则调用时将路径转换为 inode 的文件访问之外,审计现在还可以观察路径的执行,即使路径在规则调用中不存在,或者在规则调用后文件被替换了。这允许规则在升级程序可执行文件后或甚至在其安装之前继续运行。 - 记录安全事件
pam_faillock
认证模块能够记录失败的登录尝试。也可以将审计设置为记录失败的登录尝试,并提供有关试图登录的用户的附加信息。 - 搜索事件
审计提供了ausearch
工具,可用于过滤日志条目,并根据多个条件提供完整的审计跟踪。 - 运行总结报告
aureport
实用程序可用于生成记录事件的日常报告等。然后,系统管理员可以分析这些报告,并进一步调查可疑的活动。 - 监控网络访问
iptables
和ebtables
工具可以配置为触发审计事件,允许系统管理员监控网络访问。系统性能可能会受到影响,具体取决于审计所收集的信息量。
审计系统架构
审计系统由两个主要部分组成: 用户空间应用程序和工具 ,以及 内核端系统调用处理 。内核组件接收用户空间应用程序的系统调用,并通过以下过滤器对其进行过滤: user
、task
、fstype
或 exit
。 [1]
用户空间审计守护进程 从内核收集信息,并在日志文件中创建条目。其他审计用户空间工具 与 审计守护进程 、 内核审计组件 或 审计日志文件 进行交互:
audisp
- Audit 分配程序守护进程与 Audit 守护进程交互,并将事件发送到其他应用程序,以便进一步处理。此守护进程的目的是提供插件机制,以便实时分析程序可以与审计事件交互。auditctl
- 审计控制实用程序与内核审计组件交互,以管理规则并控制事件生成进程的多个设置和参数。- 其余的审计工具会将审计日志文件的内容作为输入,并根据用户的要求生成输出。例如,
aureport
工具生成所有记录的事件的报告。
Linux 系统安全加固
Linux 系统安全加固常用方法
服务网络安全
- 启用防火墙,并确保入口流量都是必须的,禁止无关的 IP 访问目标主机上的服务(端口)
系统软件安全检测
定期扫描系统上安装的软件,确保关键系统命令未被篡改,例如使用
rpm -Va
对所有系统上的软件进行校验,检查是否有软件被篡改# rpm -Va
.......T. /usr/src/kernels/3.10.0-1160.114.2.el7.x86_64/virt/lib/Kconfig
.......T. /usr/src/kernels/3.10.0-1160.114.2.el7.x86_64/virt/lib/Makefile
S.5....T. c /root/.bash_profile
S.5....T. c /root/.bashrc
.M....... /var/run/supervisor
missing /etc/filebeat/fields.yml
SM5....T. c /etc/filebeat/filebeat.yml
....L.... c /etc/pam.d/fingerprint-auth
....L.... c /etc/pam.d/password-auth
....L.... c /etc/pam.d/postlogin
....L.... c /etc/pam.d/smartcard-auth
....L.... c /etc/pam.d/system-auth输出的每一行对应一个文件,前 9 个字符的字符串显示了该文件的属性状态。每个字符的位置代表了特定的属性检查结果。
rpm -Va
对比的是当前系统中文件的状态与 RPM 数据库中记录的文件状态。每个字符的含义:
- 第 1 位 : 文件类型 (S).
如果文件丢失了,则会显示S
(代表文件缺失,”File is missing”)。 - 第 2 位:文件大小 (5)
如果文件大小与 RPM 数据库中的记录不一致,则会显示5
- 第 3 位:文件权限(模式/权限位,M)
如果文件的权限与 RPM 数据库记录的不一致,则会显示M
。 - 第 4 位:文件的所有者 (U)
如果文件的所有者与 RPM 数据库记录的不一致,则会显示U
- 第 5 位:文件所属的组 (G)
如果文件的所属组与 RPM 数据库记录的不一致,则会显示G
- 第 6 位:文件的设备类型 (D)
如果文件的设备类型(如块设备或字符设备)与 RPM 数据库记录的不一致,则会显示D
- 第 7 位:文件的时间戳 (T)
如果文件的修改时间与 RPM 数据库中的记录不一致,则会显示T
。 - 第 8 位:文件的校验和 (5)
如果文件内容的校验和与 RPM 数据库记录的不一致,则会显示5
。 - 第 9 位:文件的符号链接 (L)
如果文件是一个符号链接,并且符号链接目标发生变化,则会显示L
。 - 如果是配置文件,会被标记为
c
- 第 1 位 : 文件类型 (S).
文件加固
文件系统加固
Linux 操作系统中的很多目录都有约定的用途,可能会挂载单独的文件系统,不同用途的目录,对权限的要求不同,从安全角度考量,可以针对文件系统进行一定程度的安全加固。
文件系统的挂载,主要依赖配置文件 /etc/fstab
,此配置会被 mount
、dump
、fsck
等命令使用,其权限应该设置为 644
,属主和属组都应该是 root
。在挂载不同用途的文件系统时,可以根据其用途配置权限限制。以下列出部分示例
可用的挂载选项可以查看
man fatab
、man mount
、man 5 ext4
等内容中的选项,不同的文件系统支持不同的挂载选项,通用的挂载选项(独立于文件系统)可以查看man mount
中的FILESYSTEM-INDEPENDENT MOUNT OPTIONS
部分
/home/
目录下通常是用户家目录,可能会挂载到单独的文件系统,根据其特性,可以配置以下限制nosuid
: 禁止其中的文件/目录配置 SUID 或 SGID 权限nodev
: 禁止其中的设备被内核识别,放置在此目录下的设备可能都是恶意设备,应该被禁止识别并使用noexec
: 禁止此文件系统中的可执行文件执行。
/tmp/
目录也可以设置以下限制nosuid
nodev
noexec
关键文件审计及监控
auditd 审计
可以使用 `auditd` 服务对系统上的关键文件进行审计日志记录关键文件监控
系统上的某些关键文件,如常用可执行文件(/sbin/
下的文件)、关键配置文件等,要监控其是否被恶意修改。可以参考以下方法
find
命令搜索文件修改时间
find
命令的-mtime
可以查找文件的 内容修改时间find
命令的-ctime
可以查找文件的 创建时间/属性修改时间如常用的系统命令不会出现内容的修改和属性的修改,如果出现这些现象,很可能属于恶意篡改,可以使用
find
命令查找或是监控这些变化# find /sbin -mtime -1
/sbin
/sbin/init
/sbin/reboot在发现关键文件被篡改后可以及时发送告警。可以使用
stat
命令检查文件变更的更详细信息# stat /sbin/init
File: '/sbin/init' -> '../bin/systemd'
Size: 14 Blocks: 0 IO Block: 4096 symbolic link
Device: fd01h/64769d Inode: 9551 Links: 1
Access: (0777/lrwxrwxrwx)
Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:bin_t:s0
Access: 2016-02-03 03:34:57.276589176 -0500
Modify: 2016-02-02 23:40:39.139872288 -0500
Change: 2016-02-02 23:40:39.140872415 -0500
Birth: -为了更好的监控关键文件的篡改,可以在系统运行之初就为其创建一个包含关键文件的
mtimes
和ctimes
信息的数据库,并在系统运行过程中通过脚本检测关键文件的mtimes
和ctimes
并和原始数据库中的信息进行对比已检测文件是否被篡改。通常的 Intrusion Detection System 基本都实现了类似的功能。通常需要关注的可以被
find
检查的其他特殊类型文件和特殊权限还可能包括以下事项:File or Settings Scan Command Problem With File or Settings SUID
find / -perm -4000
Allows anyone to become the file’s owner temporarily while the file is being executed in memory GID
find / -perm -2000
Allows anyone to become a group member of the file’s group temporarily while the file is being executed in memory. rhost files
find /home -name .rhosts
Allows a system to trust another system completely. It should not be in /home
directories.Ownerless files
find / -nouser
Indicates files that are not associated with any username. Groupless files
find / -nogroup
Indicates files that are not associated with any group name.
Viruses
ClamAV
ClamAV 是一个开源并免费的 Linux 杀毒(Antivirus Software)软件。
Rootkit
chkrootkit
chkrootkit
是 Linux 上常用的检测 rootkit
的工具,这个工具的结果需要更深入的分析,它可能出错
# chkrootkit | grep INFECTED |
Rootkit Hunter
Rootkit Hunter 是另一个比较出名的 rootkit
检测工具
Intrusion Detection and Prevention System
入侵检测和防御系统 可以监控系统上的活动并找到潜在的恶意活动或者进程并报告相关活动。Linux 上常用的入侵检测系统有
aide
: Advanced Intrusion Detection Environment.snort
tripwire
Linux 文件系统
传统的 PC 架构计算机使用 Master Boot Record(MBR)分区表(Partition Tables) 来存储计算机上的 磁盘分区(Disks Partitions) 信息。MBR 有以下特点:
- MBR 的分区最大支持 2TB 的容量。
最新的 UEFI 计算机架构使用 GUID(Globally Unique Identifier) Partition Tables(GPT) 标准来替代旧的 BIOS 方法启动计算机操作系统。相比于 MBR,GPT 有以下优势及特性:
- GPT 的分区最大能支持到 9.4ZB
传统的基于 MBR Partition Tables 的最重要的分区工具是 fdisk
,但是它目前不支持 GPT Partitions ,新的工具 parted
正在顶替 fdisk
的功能。
parted 用法
要查看 parted
常见用法,可以参考 parted --help
或在交互模式中使用 help
指令
查看分区表信息
要查看系统上的分区信息,使用以下方式之一
parted -l
# parted -l
Model: Amazon Elastic Block Store (nvme)
Disk /dev/nvme0n1: 85.9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
14 1049kB 5243kB 4194kB bios_grub
15 5243kB 116MB 111MB fat32 boot, esp
1 116MB 85.9GB 85.8GB ext4
Model: Amazon Elastic Block Store (nvme)
Disk /dev/nvme1n1: 107GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 53.7GB 53.7GB primary ext4
Model: Unknown (unknown)
Disk /dev/zram0: 33.2GB
Sector size (logical/physical): 4096B/4096B
Partition Table: loop
Disk Flags:
Number Start End Size File system Flags
1 0.00B 33.2GB 33.2GB linux-swap(v1)parted
交互模式,在交互模式中使用指令p
# parted
GNU Parted 3.4
Using /dev/nvme0n1
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) p
Model: Amazon Elastic Block Store (nvme)
Disk /dev/nvme0n1: 85.9GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
14 1049kB 5243kB 4194kB bios_grub
15 5243kB 116MB 111MB fat32 boot, esp
1 116MB 85.9GB 85.8GB ext4
(parted)
创建 GPT 分区格式的硬盘
要使用 parted
对硬盘指定其分区表类型,假设硬盘为 /dev/nvme1n1
(默认表示第二个 NVM(NVMe, NonVolatile Memory Disks express, NVM 磁盘设备专用的通信接口协议) 硬盘的第一个 Namespace),参考以下步骤:
parted /dev/nvme1n1
,进入交互模式并对指定的硬盘进行分区操作, 以下步骤会导致硬盘上所有的分区及数据丢失- 在交互模式中使用
mklabel gpt
命令,配置硬盘使用 GPT 类型的分区表,而不是 MBR(parted) mklabel gpt
Warning: The existing disk label on /dev/nvme1n1 will be destroyed and all data
on this disk will be lost. Do you want to continue?
Yes/No? Yes
(parted) - 在交互模式中使用
mkpart
命令进行分区操作,分区完成后使用p
指令检查分区(parted) mkpart
Partition name? []? alldisk
File system type? [ext2]? xfs
Start? 1
End? 123GB
(parted) p
Model: SanDisk Ultra (scsi)
Disk /dev/nvme1n1: 123GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 123GB 123GB xfs alldisk - 使用
quit
指令退出parted
交互模式。fdisk
交互模式中,只有最终执行了w
命令保存,对硬盘的操作才会最终生效,和fdisk
不同,parted
命令对硬盘的更改立即生效 - 对分区进行格式化并挂载使用,如果需要持久化挂载(系统重启后依然生效),可以将挂载信息写入
/etc/fstab
mkfs -t xfs /dev/nvme1n1p1
mount /dev/nvme1n1p1 /mnt/
Linux 文件相关操作
文件权限
在 Linux 系统中,普通的文件权限控制通过关联身份三元组 (user
, group
,other
) 和权限三元组 (r
, w
, x
) 来实现访问控制。
系统存在一个 umask
值(针对用户),umask
是一个权限掩码,它决定了新建的文件或者目录的默认权限,使用 umask
命令可以查看当前(用户) 的 umask
值
$ umask |
比如如上所示的 umask
值,决定了当前(用户)创建的文件和目录的默认权限
目录
- 默认权限为0755
(777-022
),即rwxr-xr-x
文件
- 默认权限为644
(666-022
),即rw-r--r--
因此要配置当前(用户)创建的文件或者目录的默认权限,只需要配置合适的 umask
值即可。配置 umask
值可以通过以下方法
- 临时方法
umask 027
- 永久方法
根据需求将umask 027
配置添加到配置文件中,如/etc/profile
、~/.bashrc
、~/.bash_profile
等
如果需要更进一步的权限控制,需要使用到 Sticky Bit
和 ACL,更细力度的控制还包括 SELinux. 相关扩展权限标志如下:
- 文件/目录 权限最后会包含一个
.
: 表示 SELinux (Security Enhanced Linux)扩展权限。可以使用命令ls -l -Z
查看具体权限。 - 文件/目录 权限最后会包含一个
+
: 表示 文件/目录 有 ACL(Access Control List) 扩展权限,相关操作及命令参考 - 目录 权限最后会包含一个
t
: 表示此 目录 有 Sticky Bit 扩展权限,相关操作及命令参考 - 可执行文件 权限中属主(Owner)的
x
位变为s
: 表示此 可执行文件 配置了 Set UID 扩展权限 - 可执行文件/目录 权限中属组(Group)的
x
位变为s
: 表示此 目录 配置了 Set GID 扩展权限
Linux 文件权限控制中,除了 SELinux 权限,其他权限控制属于 DAC(Discretionary Access Control),SELinux 属于 MAC(Mandatory Access Control),系统执行权限控制的过程中, 如果 DAC 权限允许资源访问,会继续进行 SElinux 权限检查,如果 DAC 权限拒绝资源访问,不会再进行 SELinux 权限检查
Set UID
- 只有 可执行的二进制程序和可执行的代码 才能设定 SUID 权限。
- 命令执行者首先要对该程序拥有
x
(执行)权限。 - 命令执行者在执行该程序时获得该程序文件 属主(Owner) 的身份。
- SetUID 权限只在该程序 执行过程中 有效,也就是说身份改变只在执行过程中有效。
设定 SUID 和 SGID 时,传统的 3 元组权限方式(如 rwxrwxrwx
= 777
) 变为 4 元组(Srwxrwxrwx
),其中的 S
选项包括:
4
代表 SUID,如4777
2
代表 GID,如2777
1
代表 Sticky BIT,如1777
7
代表全部设置, 如7777
SUID 设定命令格式:
chmod 4777 可执行文件名 |
取消 SUID 设置:
chmod 777 可执行文件名 |
假如某个可执行文件的属主为
root
,其设置了 SUID,普通用户运行此可执行文件时会暂时拥有root
的权限,有一定的风险存在,因此要谨慎设置,为系统安全考虑,要定期查找系统上拥有 SUID 权限的可执行文件并核对其是否存在风险。
Set GID
对 可执行文件 来说,SGID 拥有和 SUID 同样的作用,只不过 **命令执行者在执行该程序时获得该程序文件 属组(Group) 的身份。
SGID 设定方法:
chmod 2777 可执行文件名 |
Sticky Bit
粘滞位 (Sticky Bit
) 只能用于目录,并对其中的文件有特殊的权限控制。他的主要作用是确保只有文件的所有者才能够删除或者修改文件。要给某个目录配置 粘滞位 (Sticky Bit
) ,使用以下命令
chmod +t directoryname |
这将为目录 directoryname
配置粘滞位 (Sticky Bit
),以下命令可以验证 粘滞位 (Sticky Bit
)是否存在。如果目录的权限列表中有 t
标志,表示目录设置了 粘滞位 (Sticky Bit
)
$ ls -l directoryname |
设置粘滞位后,只有文件的所有者才能删除或修改该文件。其他用户即使有写权限(w
),也无法删除其他用户的文件。
Linux systemd-journald 服务说明
systemd-journald 服务简介
systemd-journald
服务是 systemd init
系统提供的收集系统日志的服务。它会根据从内核、用户进程、标准输入和系统服务错误收到的日志记录信息,维护结构化的索引日记,并以此方式来收集和储存日志记录数据。systemd-journald
服务默认处于启用状态。
默认情况下,systemd-journald
在 /run/log/journal/
中储存日志数据。由于 /run/
目录具有易失本性,因此,在重引导时会丢失日志数据。要永久保存日志数据,/var/log/journal/
目录必须存在且具有正确的所有权和权限,如此,systemd-journald
服务便可在其中储存其数据。
要在终端中查看日志信息,可以使用命令 journalctl
systemd-journald 服务常用配置
持久化日志存储
默认情况下,日志位于 /run/log/journal/
,重启后日志会丢失,为了持久化日志,可按照以下 2 种方法之一配置
方法 1
- 以
root
身份打开/etc/systemd/journald.conf
进行编辑vi /etc/systemd/journald.conf
- 将包含
Storage=
的行取消注释,并将它更改为Storage=persistent
/etc/systemd/journald.conf [Journal]
Storage=persistent
#Compress=yes
SystemMaxUse=50M
[...] - 重启
systemd-journald
之后日志会持久化存储于systemctl restart systemd-journald
/var/log/journal
。这些数据最多会占用/var/log/journal
所在文件系统空间的 10%,要更改此限制,可以修改选项SystemMaxUse=50M
- 以
Linux man 使用
在 Linux 中,命令提供的 man
手册是一份非常详细的命令使用说明手册,要了解命令的使用方法及其工作原理,熟练参考 man
手册是及其必要的。
man
手册中不仅包含了命令的使用方法,还包括了命令相关的 (配置)文件说明 、 System Calls 等相关信息,下表中列出了 man
手册不同编号对应的功能
Section Number | Section Name | Description |
---|---|---|
1 |
User Commands |
用户可以在 shell 中运行的指令说明man 命令不指定 Section Number 时默认为 1 |
2 |
System Calls |
应用程序中的功能函数调用的内核函数 |
3 |
C Library Functions |
应用程序针对特定的函数库提供的接口 |
4 |
Devices and Special Files |
程序使用的硬件或软件 |
5 |
File Formats and Conventions |
涉及的文件类型(如配置文件)及约定 |
6 |
Games |
|
7 |
Miscellaneous |
其他杂项,如 协议 、 文件系统 、 字符集 等 |
8 |
System Administration Tools and Daemons |
需要 root 权限或其他管理员权限运行的命令 |
要查看命令 man
的某个部分,可以使用以下命令查看 passwd
命令的 File Formats and Conventions
man 5 passwd |
环境信息 :
- Centos 7
为源码编译安装的软件安装 man 手册
使用源码编译安装的软件默认是没有 man 手册的,使用 man 命令会报以下错误
$ man fswatch |
要为源码编译安装的软件安装 man 手册,可以参考以下步骤,此处示例软件为 fswatch
,软件编译安装到了 /usr/local/fswatch-1.17.1/
一般情况下,源码中会附带软件的使用文档,编译安装后,可能位于以下路径,
fswatch
编译安装后的 man 手册位于/usr/local/fswatch-1.17.1/share/man/man7/fswatch.7
ls /usr/local/fswatch-1.17.1/doc
ls /usr/local/fswatch-1.17.1/share/doc
ls /usr/local/fswatch-1.17.1/share/man/man
命令使用的文档默认来源于/usr/share/man/
$ ls /usr/share/man/
cs de fr hu it ko man1 man1x man2x man3p man4 man5 man6 man7 man8 man9 mann pl pt_BR ro sk tr zh_CN
da es hr id ja man0p man1p man2 man3 man3x man4x man5x man6x man7x man8x man9x nl pt pt_PT ru sv zh zh_TW要为编译安装软件的安装
man
帮助文档,首先将fswatch
的帮助文档复制到man
页面的目录cp /usr/local/fswatch-1.17.1/share/man/man7/fswatch.7 /usr/share/man/man7/
更新
man
索引$ mandb
1 man subdirectory contained newer manual pages.
47 manual pages were added.安装成功后,可以正常使用
man fswatch
查看帮助文档。
Linux bash 常用操作
bash 快捷键
bash
常用的快捷键总结
删除类快捷键
快捷键 | 功能 | 示例 |
---|---|---|
Ctrl + D |
删除光标右侧的一个字符,等于 Delete 键 |
|
Ctrl + H |
删除光标左侧的一个字符,等于 Backspace 键 |
|
Ctrl + K |
删除从光标位置到行尾的所有字符。 | |
Ctrl + U |
删除从光标位置到行首的所有字符。 | |
Ctrl + W |
删除光标左侧的一个单词(以空格为分隔)。 | |
Alt + D |
删除光标右侧的一个单词。(空格,下划线,点分割) | |
Ctrl + C |
删除整行 |
定位类快捷键
快捷键 | 功能 | 示例 |
---|---|---|
Ctrl + F |
向前挪动一个字符 ,等于 右箭头 -> |
|
Ctrl + B |
向后挪动一个字符 ,等于 左箭头 <- |
|
Alt + F |
向前挪动一个 word | |
Alt + B |
向后挪动一个 word 。 | |
Ctrl + A |
跳到行首。 | |
Ctrl + E |
跳到行尾。 |
Recall 类快捷键
bash
中执行过的命令都保存在了历史记录中,可以通过 history
命令查看。为了快速重新执行或者修改之前的命令并执行,bash
提供了以下快捷键
快捷键 | 功能 | 示例 |
---|---|---|
Ctrl + R |
搜索 history 中 最后一个 匹配的命令 |
|
Alt + P |
搜索 history 中 最常使用 的命令 |
|
!100 |
重新执行 history 中的第 100 号的命令,无确认,会立即执行 |
|
!! |
重新执行 history 中的 最后一个 命令,无确认,会立即执行 |
bash 环境变量
shell
中的环境变量大体可以分为以下几种:
Local Variables
: 当前 Shell 中的 所有的本地变量(Local Variables
) ,要查看所有的 本地变量(Local Variables
),可以使用以下命令:set
declare
$ set | more
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:globasciiranges:histappend:interactive_comments:progcomp:promptvars:sour
cepath
BASH_ALIASES=()
BASH_ARGC=([0]="0")
BASH_ARGV=()
...
Environment Variables
: 本地变量(Local Variables
)的一部分子集(subset
)被稱為 环境变量(Environment Variables
) , 环境变量(Environment Variables
) 会被导入到任何从当前 Shell 启动的新的 Shell,要查看 环境变量(Environment Variables
) ,使用以下命令env
printenv
查看单个变量$ env
SHELL=/bin/bash
SESSION_MANAGER=local/U-3TSDMAL9IVFAQ:@/tmp/.ICE-unix/3396,unix/U-3TSDMAL9IVFAQ:/tmp/.ICE-unix/3396
QT_ACCESSIBILITY=1
COLORTERM=truecolor
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
SSH_AGENT_LAUNCHER=gnome-keyring
XDG_MENU_PREFIX=gnome-
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
GTK_IM_MODULE=fcitx
LANGUAGE=en
LC_ADDRESS=en_US.UTF-8
GNOME_SHELL_SESSION_MODE=ubuntu
LC_NAME=en_US.UTF-8
SSH_AUTH_SOCK=/run/user/408001114/keyring/ssh
XMODIFIERS=@im=fcitx
DESKTOP_SESSION=ubuntu
LC_MONETARY=en_US.UTF-8
GTK_MODULES=gail:atk-bridge
DBUS_STARTER_BUS_TYPE=session
...$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin
bash
常用环境变量 :
环境变量 | 功能 | 示例 |
---|---|---|
PATH |
可执行文件查找路径变量。 查找顺序从左向右,找到即停止 |
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin |
PS1 PS[234] |
PS1 环境变量定义了 bash 中的命令后提示符包含的内容定义中支持的元字符可以查看 man bash 手册 |
PS1="[\u@\h \W]\\$ |
bash 命令查找优先级
bash
中命令执行优先顺序如下:
- Aliases : 由
alias
命令配置的命令别名。 - Shell 预留的关键字 : 主要是 Shell 编程中会用到的关键字,如
do
、while
、case
、else
等。 - Built-in Command : shell 内嵌的命令,如
cd
、echo
等 - Filesystem Command : 环境变量
PATH
中的命令。
要查找命令所在位置,可以使用 type
和 which
命令
$ type bash |
如果要查找命令所在的所有位置,可以使用
type -a ls
,如上所示,这会显示ls
命令所在的所有位置
bash 环境变量配置优先级
Linux 系统中的多个配置文件中可以配置环境变量,其中有些会针对所有的用户和 shell
生效,有些只会针对特定的用户生效。
以下表格中列出了常用的环境变量的配置文件:
File | Description |
---|---|
/etc/profile |
此配置中的环境变量对所有用户生效,在用户登陆时为其配置环境变量 ,它一般会加载(包含)/etc/profile.d 中的配置 |
/etc/bashrc |
此配置中的环境变量针对所有的 shell 生效,每次打开一个 bash 时会执行 ,一般会设置包括 登陆提示 、 alias 等 |
~/.bash_profile |
此配置中的环境变量对 当前登陆 用户生效,仅在用户登陆时为其配置环境变量 ,一般会加载 ~/.bashrc 文件 |
~/.bashrc |
此配置中的环境变量针对 当前登陆 的用户 bash 生效,并在用户打开每个新的 bash 时执行 |
~/.bash_logout |
此配置中的环境变量对 当前登陆 用户生效,仅在 当前登陆用户登出(logout) 时执行 |