Linux基础
欢迎你来读这篇博客,这篇博客主要是关于linux基础。
其中包括了关于我的见解和收集的知识分享。
序言
Linux 简介
Linux 与 windows 类似的,他们都是操作系统。只不过 Linux 一般用于企业环境,相对更稳定。
发展历史
- 孵化:Unix 贝尔实验室
- 谭宁邦 教学:Mint (mini unix
- 斯托曼
- 组织: 自由软件基金会 FSF
- 规则、协议:GPL 公共通用许可
- 要求 01:所有软件开源,可以随意修改。
- 要求 02:改完之后的内容,也要开源。
- 项目:GNU 项目 弄出个系统
- 托瓦兹:开发出了 Linux 内核
Linux 组成
- 蛋壳 - 各种应用程序: linux 各种命令,服务。。。
- 蛋清 - 命令解释器:shell, 斯托曼 GNU 项目中叫 bash
- 蛋黄 - Linux 内核: 托沃兹开发
发行版(重要的加粗)
- Debian 系列
- Debian
- Ubuntu
- 红帽系列
- RHEL Redhat Enterprise Linux
- CentOS(被红帽收购,红帽 CentOS Stream 测试版)
- Rocky Linux( CentOS 系统创始人,新出的 Linux 系统。)
- 国产系列
- 麒麟 Kylin
- 红旗
- 欧拉
- others
- 其他
- OpenSUSE
- archlinux
- 推荐选择 LTS 版本或稳定版。
虚拟机概述
虚拟机是什么:虚拟机是一种软件实现的计算机,能够模拟一台真实计算机的功能和操作系统。它通过在物理计算机(宿主机)上运行,模拟出多个独立的虚拟计算机(虚拟机),每台虚拟机都可以运行自己的操作系统和应用程序。
虚拟机分类 TODO
- 第一类虚拟机
- 第二类虚拟机
虚拟机工具:VMware workstation、virtual box、wsl、etc…
推荐VM。微信公众号 软件管家 免费获取。自己下载安装一下就是永久的。我用了几年了,应该没病毒。传播范围应该挺广的,我经常传播。
VM 安装: 略。获取软件的地方,有详细教程
主机要求:win/mac。cpu i5 以上,不推荐 m1/m2。内存最低 16G。硬盘 500G。VM 版本建议 17。vm15.5.5
之前版本和 win 的 hyper-v 冲突,只能用一个。新一些的已解决冲突问题。感兴趣可以去网上搜索相关内容。
linux 系统安装
Linux 系统安装的过程可能会因不同的发行版和使用的软件有所区别,但一般来说,可遵循以下步骤:
准备安装介质:首先需要下载一个 Linux 发行版的 ISO 文件,例如 Ubuntu、Fedora 或 CentOS 等。然后,将这个 ISO 文件烧录到 USB 闪存驱动器或 DVD 光盘,用作启动和安装介质。
启动安装介质:将安装介质插入电脑,并重新启动电脑。在 BIOS 或 UEFI 设置中,将启动顺序设置为优先从安装介质启动。
开始安装:电脑启动后,通常会出现一个菜单,选择“开始安装”或者“试用 Linux”。
选择语言:选择你的首选语言。
分区:在硬盘上为 Linux 系统分配空间。在大多数情况下,选择“自动分区”或者“使用整个磁盘”就足够了。如果你需要更精细的控制,或者需要设置多系统引导,你可能需要手动分区。
设置用户信息:输入用户名、计算机名称以及密码。
安装:点击“开始安装”或者“下一步”,安装程序将开始安装操作系统。这个过程可能会花费一段时间。在安装过程中,你可以阅读一些关于你的 Linux 发行版的信息。
安装完成:安装完成后,将提示你移除安装介质,并重新启动计算机。重新启动后,你将可以启动并使用你的新 Linux 系统。
以上是一般的 Linux 安装过程,具体可能会根据不同的 Linux 发行版和硬件环境有所不同。在安装过程中请根据屏幕提示进行操作,如果遇到问题,不要犹豫寻求帮助。
VM 网络管理
- vm
- 编辑
- 虚拟网络编辑器
- 管理员模式
- 修改 nat 模式
- 子网,掩码和服务器的对应。
- dhcp 设置,网关设置好 10.0.0.2。
- 然后去 win 的网络共享中心,找到 vm8 网卡,ipv4 地址设置成 10.0.0.1
- warning:IP 设置成你自己的
VM 安装 CentOS
- 新建虚拟机
- 选择自定义
- 稍后安装系统,避免自动安装
- 选择系统,此处 Linux-CentOS 7 64 位
- 命名,选位置。建议全英文。
- CPU 核心数
- 调整内存大小
- 网络 NAT 模式
- I/O 控制器类型选推荐
- 磁盘类型选推荐
- 创建新虚拟磁盘
- 设置最大磁盘空间,40G,不拆分,存储单个文件。
- 磁盘空间选择
- 完成
- 虚拟机设置界面,CD/DVD 配置项,选择你的系统 ios 文件地址。系统镜像文件下载,略。
- 启动
- 在第一个界面,选
Install CentOS 7 - (这一步骤可省略)按 tab,在最后添加
biosdevname=0 net.ifnames=0,回车。 - 语言选择
- 安装位置选一下磁盘
- 网络和主机名
- 以太网,打开,配置
- 常规:可用时自动链接到这个网络。
- IPV4 设置
- IP:10.0.0.200
- 子网掩码:24
- 网关:10.0.0.2
- DNS:223.5.5.5,223.6.6.6
- 主机名,自己设置一下
- 以太网,打开,配置
- KDUMP:关闭
- 软件:最小安装,选调试工具、兼容性程序库、开发工具、系统管理工具。
- 时区,关闭网络时间
- root 密码设置
- (可选)新建用户
- 安装完成后,提示重启,点击重启
- 进入系统,输入账号密码登录
- 测试
ping 10.0.0.2测一下和网关通不通 - 测试:查看 ip
ip -a - 测试:
ping www.baidu.com - IP 配置 nmtui 命令工具
- edit a connection
- 选择网卡,配置网络信息
- 退出,保存
Warning:可选
1 | |
Linux SSH 连接
SSH 协议介绍
SSH,全称 Secure Shell,是一种网络协议,用于安全地在不安全的网络上执行命令并传输数据。SSH 在计算机世界中广泛使用,特别是在进行远程系统管理和安全文件传输方面。
SSH 提供了一种安全的通道,用于两个在不安全的网络(如互联网)上的系统之间的通信。它使用公钥加密来验证远程计算机和允许远程计算机验证用户。
SSH 主要提供以下功能:
安全远程命令执行:SSH 提供了一种在远程服务器上执行命令的安全方式。
安全文件传输:SSH 包含两个重要的文件传输协议,SCP 和 SFTP。它们都可以在不安全的网络上安全地复制文件。
端口转发和隧道:SSH 可以安全地隧道各种网络协议,并为本地和远程的应用程序提供端口转发。
身份和安全:SSH 使用公钥加密和其他加密技术来提供数据完整性、加密和验证。
SSH 的默认端口是 22,但可以在服务器配置中更改。
SSH 协议有两个主要版本,SSH1 和 SSH2。SSH2 包含了对 SSH1 的许多改进,并且解决了 SSH1 中的许多安全问题。因此,SSH2 是首选的 SSH 协议版本。
SSH 的一个重要组成部分是 SSH 密钥对,它包括一个公钥和一个私钥。公钥存储在远程服务器上,私钥保留在本地计算机上。当尝试通过 SSH 连接到服务器时,服务器会使用存储的公钥来加密一个消息,然后发送到客户端。客户端使用其私钥解密消息并发送回服务器,从而验证其身份。这种方式提供了一种强大的身份验证方法,而无需传输密码。
在 Linux 实际运维当中,ssh 分服务端(SSHD)和客户端(ssh),服务端其实一般代表的就是别人可以通过 ssh 连接到服务器,而客户端则代表我们可以通过 ssh 协议连接其他服务器,而不用借助其他辅助工具,比如下面这些常见的 ssh 软件(类 UNIX 系统都会自带)
常见的 SSH 软件
OpenSSH:它是 SSH 协议的开源实现,包含了一个 SSH 客户端和服务器。适用于各种操作系统,包括 Linux、Unix、Windows 等。
PuTTY:一个免费的、开源的 SSH 和 telnet 客户端,主要用于 Windows 系统。
SecureCRT:一款商业的 SSH 客户端,提供了图形界面和一些高级功能,如多标签、脚本支持、会话管理等。
Bitvise SSH Client:又是一款商业 SSH 客户端,主要用于 Windows 系统。支持 SFTP、端口转发、动态 SOCKS 代理等。
MobaXterm:一个增强版的 SSH 客户端,集成了很多功能,如多标签、SFTP、X11 转发、内置的 Unix 命令等,主要用于 Windows 系统。
Termius:一个跨平台的 SSH 客户端,适用于 Windows、Mac、Linux、iOS 和 Android。提供了图形界面,支持多标签、端口转发、SFTP 等。
Xshell:商业软件,目前新版本提供社区版免费使用,输入邮箱申请就行了,支持 SSH1, SSH2 以及 Microsoft
Windows 平台的 TELNET 协议。提供完整的终端模拟、动态端口转发、自动登录和脚本功能等。Xshell 是商业软件,但对于学术和家庭用户,提供了免费的个人版。以上只是常见的 SSH 软件,实际上还有很多其他的 SSH 客户端和服务器软件,用户可以根据自己的需要选择合适的工具。比如
final shell
等
我个人使用的是 MobaXterm 和 开发工具内置的 ssh 工具。xshell 目前我也比较推荐。
其他协议介绍
在服务器领域不仅有 Linux,也有 WIN 的服务器,Linux 通用的是 ssh(默认端口 22),而 win 是一个 RDP 的协议(默认端口 3389)
VNC,全称是 Virtual Network Computing,是一种图形界面的远程控制技术。通过 VNC 协议,用户可以在本地计算机上操作远程计算机的桌面环境。
VNC 工作原理是:在远程计算机上运行一个 VNC 服务器程序,它会把屏幕图像(或者改变的部分)以图形的形式通过网络传送到本地计算机的 VNC 客户端。本地计算机上的用户可以看到远程计算机的桌面,并可以通过鼠标和键盘来操作远程计算机。
VNC 协议在云厂商使用比较多,可以等效于显示器来使用,在云厂商的网页控制台里面一般都可以找到。在互联网早期,云并未大面积普及的时候,如果误操作导致网络异常,是无法通过 ssh 或者 rdp 连接的,就可以提供额外的 vnc 方式去连接(前提是你额外配置过,主要针对虚拟机)。独立服务器还可以通过 ipmi/带外方式进行操作。
连接步骤:
- 新建会话
- 输入服务器的 IP,端口,账号,密码
- 连接成功
特别注意:Linux 是可以设置为空密码的,如果通过控制台(显示器)输入账号以后是可以直接进入系统,不需要密码的,但是在 ssh 连接的时候是必须用密码的,如果出现服务器为空密码的情况,是无法 ssh 连接进去的。
堡垒机与跳板机
跳板机,堡垒机是未来工作环境中,远程连接必备设备或服务,要求我们只能连接堡垒机或跳板机,然后通过它在对服务器进行管理与控制。
- 跳板机:简单的跳板工具.
- 堡垒机:跳板工具+审计功能.
- 开源产品:Jumpserver,Teleport (很简单,下载,启动,web 进去配置一下就行了)
- 物料硬件设备:购买
- 云服务:购买
正文
Linux 基础知识
- 四剑客
- awk
- sed
- grep
- find
命令相关
1 | |
linux 命令格式:command option arguments/parameter
1 | |
- 关机命令
1 | |
- 重启
1 | |
- cd & pwd
1 | |
- mkdir
1 | |
- touch
1 | |
- vi & vim
linux 文件编辑器。提 vi 之前必须得先提提 vim,vi 可以理解是早期的版本,vim 是升级版本,具备更多的功能,但是 vim 在默认的 Centos 最小化安装是不会自带的,需要单独安装软件包 vim-enhanced
主要区别是以下几个方面:vim 支持可视化、语法高亮、自动补全、支持多级撤销和重做、插件支持、执行外部命令、分屏编辑、搜索和替换功能
Vi 编辑器有三种主要的工作模式,它们是命令模式(Command Mode)、插入模式(Insert Mode)和底线命令模式(Last Line
Mode)。每种模式都有不同的功能和用途。
- 命令模式:执行多种操作
- 移动光标
- 直接通过小键盘就可以上下左右移动
- G :到文件末尾
- gg: 到文件开头
- 100gg:到第 100 行
- ^: 到行首
- $: 到行尾
- :set number: 显示行号
set nonu - :行号:直接定义到某某行,比如 :10 就是到第 10 行
- 删除
- x:删除光标所在位置的字符。
- dd:删除光标所在行
- 复制和粘贴
- yy:复制当前行。
- p:粘贴。
- 搜索
- /:开始向下搜索。
- ?: 开始向上搜索。
- n:继续向上搜索。
- N: 继续向上搜索。
- 撤销和重做
- u:撤销上一步操作。
- Ctrl + r:重做。
- 移动光标
- 插入模式:输入、编辑文本
- 进入方式
- i:在当前光标位置插入文本。
- a:在光标后的位置插入文本。
- o:在当前行的下方新建一行并进入插入模式。
- 退出插入模式:
- 按下 ESC 键,返回到命令模式。
- 进入方式
- 底线命令模式:执行文件保存、退出 Vi 等操作
- :w 保存文件。
- :q 退出 Vi。
- :wq 或 ZZ 保存文件并退出 Vi。
- ! 强制操作,不单独操作,组合使用,用于强制退出或者强制保存退出。
- 模式切换
- 从命令模式切换到插入模式,按下 i、a 或其他插入命令。
- 从插入模式切换到命令模式,按下 ESC 键。
- 从命令模式切换到底线命令模式,按下 : 键。
- 从底线命令模式切换到命令模式,按下 ESC 键。
1 | |
- ls
1 | |
- mv
1 | |
- cp
1 | |
- rm
1 | |
- echo
1 | |
- cat
1 | |
- less
1 | |
- more
1 | |
- head
1 | |
- tail
1 | |
- wc
1 | |
- which & whereis
1 | |
- find
1 | |
- locate
1 | |
- grep
1 | |
- tar
1 | |
gzip
gzip filename原文件会被删除
bzip2
bzip2 filename原文件会被删除bzip2 -d filename.bz2
zip
zip -d filename.gz
gunzip
gunzip filename.gz
bunzip2
bunzip2 filename.bz2
unzip
unzip archive.zip
diff & vimdiff
1 | |
- WGET
wget 是一个非常强大的命令行下载工具,它可以用来下载文件、网页、目录等各种资源。它支持递归下载、断点续传、镜像网站等功能,非常适合自动化和批量下载任务。
1 | |
- CURL
curl 是一个强大的命令行工具,用于在客户端和服务器之间传输数据。它支持广泛的协议,包括 HTTP、HTTPS、FTP、SFTP
等,并提供了丰富的功能和选项。wget 最主要的功能是下载,但是时间在运维中,也只是用到了下载这个功能,虽然 curl 也可以达到同样的目的,只是 curl 最主要的功能调试 http 服务。
1 | |
- NETSTAT
1 | |
- SS
ss 命令是 netstat 命令的替代品,它提供了与 netstat 类似的功能,但性能更优,输出更详细。ss 命令的基本语法如下
1 | |
与 netstat 相比,ss 命令的优势在于:
更快的执行速度,特别是在连接数量非常大的情况下。
输出更加详细和丰富,包括更多的连接信息和统计数据(信息也就更多,看起来也相对麻烦)。
支持更多的过滤和查询选项,可以更精确地定位问题。大部分问题其实也不需要用到那么多选项。
SU
su 是在类 Unix 操作系统(如 Linux、BSD 等)中用于切换用户的命令。它的主要作用是让当前用户临时切换到另一个用户,可以是超级用户(root)或者系统中的其他用户。
1 | |
- sudo
sudo 是类 Unix 系统(如 Linux、BSD 等)中的一个命令,用于允许授权用户以另一个用户的身份执行命令。它的名称来源于”Superuser Do”
(超级用户执行),用于执行需要超级用户权限(通常是 root 用户权限)的任务,而无需直接切换到 root 用户。
- 权限管理:
- 临时提升权限:允许普通用户在需要时以特权用户(通常是 root)的身份执行命令,执行完毕后权限自动降低为普通用户。
- 授权控制:管理员可以通过配置 sudoers 文件详细控制哪些用户可以以哪些用户的身份执行哪些命令,以及在哪些主机上执行。
- 安全性:
- 审计:sudo 的使用可以被记录和审计,管理员可以了解哪些用户在何时执行了哪些特权操作,有助于系统安全和问题追踪。
- 限制权限:相比直接使用 root 用户,sudo 允许更细粒度地控制用户对系统的访问权限,减少了误操作和滥用特权的风险。
1 | |
- 密码验证:默认情况下,sudo 会要求用户输入自己的密码来验证身份。
- 安全配置:应当小心配置 sudoers 文件,确保只有可信用户可以执行特权操作,并限制执行的具体命令和参数。
- 不建议直接使用 root 用户:推荐使用 sudo 来执行需要特权的任务,以避免潜在的安全风险和操作失误。
1 | |
- UMASK
umask 是一个 Unix/Linux 的 shell 命令,用来设置文件创建时的默认权限。这是一个设置了用户文件和目录创建模式的掩码值。
在 Unix/Linux 系统中,当创建新的文件或目录时,系统会根据 umask 值来设置新文件或目录的默认权限。这个 umask 值通常是一个 4
位的八进制数,如 0022、0007 等
1 | |
- chmod
chmod 命令是用于在 Unix 和类 Unix 操作系统(如 Linux)上改变文件或目录的权限的命令。它是 “change mode”
的缩写,允许用户设定文件或目录的读、写、执行权限,以及特殊权限(如 SUID、SGID、Sticky bit)等。
1 | |
- chown
chown 命令用于更改文件或目录的所有者(owner)。它允许系统管理员或文件所有者将文件或目录的所有权转移给其他用户或组。
1 | |
history
显示命令历史:直接在 Bash 终端中输入 history 命令即可显示当前会话中执行过的命令列表,每行一个命令,序号从小到大排列。
使用序号重新执行命令:可以使用 ! 加上命令的序号来重新执行特定的命令。
搜索历史记录:可以使用 Ctrl+R 键来搜索历史记录中的命令。按下 Ctrl+R 后,输入关键字(如 vi),Bash 将会显示最近使用过的包含该关键字的命令,按下
Enter 可以执行搜索到的命令。清空整个历史记录:可以使用 history -c 命令清空当前 shell 会话的所有历史记录。
保存历史记录到文件:使用 history -w 命令将当前的命令历史记录保存到默认的历史文件(通常是 ~/.bash_history)中,这样即使关闭
shell 会话,历史记录也能被保留
总结
- 我们通常通过该命令分析曾经执行过的命令,来确定服务器的某些状态是谁执行的,比如谁在什么时候删除了文件,修改了时间等操作。
- 非正常退出是不会保存到历史记录的,必须是正常退出才会自动保存当前 shell 执行的命令。
- 不同的用户的 histroy 是独立的 ,因为这个文件是被记录在家目录.bash_history 文件。
- 快速生成 1000 条的历史命令。 for ((i=1; i<=1000; i++)); do echo “echo Command $i”; history -s “echo Command $i”; done
- 最常用的配置是修改历史命令数量,和添加时间戳及用户功能。
HISTSIZE=10000export HISTTIMEFORMAT="%F %T $(whoami)" - ctrl+r 搜索以后,如果这个命令被执行过多次,可以继续用 ctrl+r 继续向前搜索。
- echo
1 | |
应用场景
在脚本中用于输出调试信息或提示消息。
用于打印变量值,方便调试和查看内容。
结合重定向符号(> 和 >>)将输出内容写入文件,后面将单独将重定向。
date
在 Linux 基础软件-ntp 里面我们讲过在没有 ntp 或者 chrony 的时候可以通过 date 来设置时间。
date 命令在 Linux 和 Unix 系统中用于显示或设置系统的日期和时间。它可以输出当前的日期时间,或者根据指定的格式来格式化日期时间的输出。
1 | |
应用场景
在脚本中记录日志,使用 date 命令添加时间戳。
用于文件名的时间戳,例如备份文件。
调试和分析日志文件时,确定特定事件发生的时间。
在需要精确计时和定期任务的自动化脚本中使用。
alias
我们曾经说过有一个命令 ll,实际上是 ls -l。他们的实现方式实际就是 alias。当然还有很多命令默认都是有 alias 的。
alias 命令用于在命令行中创建命令别名,允许用户为常用命令或命令序列定义简短的替代名称。这样做可以显著提高命令行操作的效率和便捷性。
1 | |
永久生效
- 在终端中定义的别名仅在当前会话中有效,关闭终端后会丢失。如果希望别名永久生效,可以将其添加到用户的 shell 配置文件中,比如:
- 对于 bash shell,可以将别名定义添加到 ~/.bashrc 文件中。
- 然后使用 source ~/.bashrc 命令使其立即生效,或者重新启动终端。
应用场景
简化命令行操作: 将常用的复杂命令或长命令序列定义为简单易记的别名,减少输入量。
增强命令功能: 向命令添加默认参数或选项,以便于特定需求的快速调用。
提高工作效率: 根据个人工作流程和使用习惯优化命令行环境,使得操作更高效。
时间
- mtime modify 修改时间,最常用
- atime access 访问时间
- ctime change 文件属性的变化时间
echo
echo 是在 Linux 和 Unix 系统中常用的命令,主要用于在终端输出指定的文本或变量值。它也可以用来打印简单的文本消息或变量的值。
1 | |
应用场景
在脚本中用于输出调试信息或提示消息。
用于打印变量值,方便调试和查看内容。
结合重定向符号(> 和 >>)将输出内容写入文件,后面将单独将重定向。
date
date 命令在 Linux 和 Unix 系统中用于显示或设置系统的日期和时间。它可以输出当前的日期时间,或者根据指定的格式来格式化日期时间的输出。
1 | |
应用场景
在脚本中记录日志,使用 date 命令添加时间戳。
用于文件名的时间戳,例如备份文件。
调试和分析日志文件时,确定特定事件发生的时间。
在需要精确计时和定期任务的自动化脚本中使用。
top
top 命令是一个功能强大的实时进程监视器,在 Linux 和 Unix 系统中广泛用于监控系统的运行情况和进程活动。它以交互式的方式显示系统当前的进程列表,并实时更新各个进程的相关指标,如 CPU 使用率、内存使用率等。
- 第一行:全局信息
- 第二行:进程概述
- 第三行:cpu 概述
- 第四/五行:内存概述:
- 进程列表
1 | |
- sort
1 | |
- uniq
1 | |
linux 文件系统相关
linux 目录及含义
相对路径 绝对路径的含义:略
目录结构大部分情况下是相似的,具体可能会根据不同的发行版有所不同。
Linux 与 Windows 目录区别:Linux 目录:一切从根开始,形似一个倒挂的大树。Windows 下面目录:从 C 盘或 D 盘开始
- / 根目录
- /root root 用户的家目录
- /bin 二进制目录,存放系统的基本命令,如 ls、cd、rm 等
- /boot 启动目录,有点类似 win 的启动光盘
- /etc 系统服务配置文件的目录,存放系统,服务的配置
- /etc/hostname 主机名配置文件
- hostnamectl set-hostname newHostName001
- cat /etc/hostname
- /etc/hosts 主机名和 ip 的对应关系
- /etc/sysconfig/network-scripts/ifcfg-eth0 网卡配置文件
- /etc/rc.local 开机自启文件 把需要开机的时候自动运行的命令,服务放在到这个文件中
- 第 1 次使用这个文件之前需要给/etc/rc.d/rc.local 增加执行权限
chmod +x /etc/rc.d/rc.local - /etc/rc.local 本质是个快捷方式(软连接),源文件是/etc/rc.d/rc.local
- 第 1 次使用这个文件之前需要给/etc/rc.d/rc.local 增加执行权限
- /etc/fstab 开机自动挂载的配置文件
- /etc/motd 文件中的内容会在用户登录系统后显示出来
- /etc/issue 和 /etc/issue.net 文件中的内容会在用户登录系统前显示出来。这个文件内容应该清空。
- /etc/hostname 主机名配置文件
- /lib /lib64 库文件目录,存放系统动态链接库和内核模块
- /mnt 挂载目录,用于挂载其他文件系统
- /opt 可选的应用软件包目录,一些附加的应用程序会放在这里
- /proc 虚拟文件系统目录,用于系统核心,例如进程和系统信息
- /proc/cpuinfo
- /proc/meminfo
- /proc/loadavg
- /proc/mounts
- /sbin 系统二进制文件目录,存放需要超级用户权限才能运行的二进制文件
- /tmp 临时目录,通常重启以后,里面的内容都会删除
- /usr 用户资源目录,通常重启是应用程序所在目录
- /var 可变目录,比如常用的日志,默认软件的数据目录
- /var/log/ 系统及服务的各种日志
- /var/log/secure 用户登录情况 分析是否被恶意破解
- /var/log/messages 通用各种服务的日志 分析服务、系统异常
- /loft_found 临时目录,一般用不到
- /home 普通用户家目录
- /home/user1
- /home/user2
- /dev 设备文件目录,存放硬件设备文件
- /dev/hd[a-d] IDE 硬盘机
- /dev/sd[a-p] SCSI/SATA/USB 硬盘机
- /dev/sd[a-p] USB 快闪碟
- /dev/fd[0-1] 软盘驱动器
- /dev/lp[0-2] 25 针打印机
- /dev/usb/lp[0-15] USB 打印机
- /dev/usb/mouse[0-15] USB 鼠标
- /dev/psaux PS2 鼠标
- /dev/cdrom 当前 CDROM/DVDROM
- /dev/mouse 当前的鼠标
- /dev/ht0 IDE 磁带机
- /dev/st0 SCSI 磁带机
- 目前 IDE 接口类型基本上很少见了,常见的是 SAS 和 SATA
挂载:利用一个目录当成进入点,将磁盘分区槽的数据放置在该目录下。就是进入该目录就可以读取该分割槽的意思
linux 磁盘系统相关
在 Windows 里面我们常见的涉及到磁盘那是 C 盘,D 盘,E 盘等。但是在这些盘符到底是在一个硬盘还是几个硬盘呢?如果我们不到磁盘管理里面看是看不出来的,当然作为普通人其实也并不需要关心到底是几个硬盘。但是在 Linux 里面磁盘作为一种核心的资源,我们必须要对他足够了解才行。
在前面的 Linux 目录介绍里面我们说过/dev 目录就是硬件目录,如果服务器里面有硬盘,当然也就在这里形成一个类似的目录。在 Linux 里面我们一般用/dev/sda 及/dev/sdb 来代表一个独立的磁盘。
然后把一个磁盘/dev/sda 分成一个或者多个分区,然后分别挂载到不同的目录下,这个分区如果挂载到 Linux 目录上面,就基本等效于 Windows 的盘符,只是 Windows 的盘符是 C 盘,D 盘,而 Linux 则是下面这种目录树结构。
/dev/sda1 放到 /boot 目录
/dev/sda2 放到 / 目录
1 | |
介绍 2 个命令,一个是上面已经用到 lsblk,我们用他查看有多少个磁盘,以及分区情况。如果磁盘故障或者其他原因未识别到,这里也不会显示。在实际运维中也可用于判断磁盘是否异常。另外一个命令是 fdisk,他就会显示完整的路径,日常使用看个人习惯即可。
1 | |
在比较早的时候,磁盘有一种接口叫 IDE,在 Linux 服务器里面的设备命名:/dev/hda,/dev/hdb。
目前主流的 SATA 接口,在 Linux 服务器里面的设备命名:/dev/sda,/dev/sdb。
目前高端服务器里面还有带有 NVME 接口的,在 Linux 服务器里面的设备命名: /dev/nvme0n1,/dev/nvme0n2。
目前云厂商使用的云硬盘,由于都是分布式的,在 Linux 服务器里面的设备命名: /dev/vda/,/dev/vdb。
创建分区
基于已经有一块磁盘的情况下,我们在通过虚拟机界面添加了一块硬盘(过程这里就不介绍),可以看到 2 个硬盘分别是 sda 和 sdb 两块磁盘。
1 | |
1.开始分区
1 | |
2.进入选择菜单
1 | |
3.创建新分区
1 | |
这里涉及到 2 个概念,就是主分区和扩展分区。
主分区:主分区是直接位于硬盘上的一个分区,每个主分区都有一个唯一的编号,最多能分 4 个。比如分出来的/dev/sda1,/dev/sda2 这样就是使用 2 个分区。并且每个主分区都可以包含一个文件系统。
扩展分区:但是如果我需要分更多的分区,就必须引用扩展分区,然后在扩展分区里面再划分更多的分区。不过现在用的已经比较少了。
在分区细节的时候,这里有一个扇区的概念,那什么是扇区呢?可以简单理解就是把一个磁盘从物理上分成了多少份,然后每份固定大小,如果要定义一个 10g 大小,就需要用 10G/每个扇区大小。
比如我们用到的磁盘大小是 20G,大概就是 4096000 个扇区,每个扇区就是 512 字节,如果我们再分区的时候需要分成 2 个,第一个 5G,那他的扇区就是从 2048 到 1000000 扇区,然后剩余 15G 就是从 1000001 到 4096000 扇区,这个数字比较大不用太精确,理解到了就可以。当然还有些保留扇区,如果有兴趣可以专门查询磁盘相关资料。
扇区的概念其实主要是在机械硬盘时代,在 SSD 时代,已经没有严格意义上的扇区。
传统的机械硬盘都是有一个马达的,如果马达转速越快,找到数据的速度就越快,这个概念在磁盘里面叫寻址。衍生出来的磁盘的转速就有了以下几个转速:5400 转,主要用于早期的笔记本;7200 转,就是市面上最常见的普通硬盘;10000 转及 15000 转就是服务器专用的 SAS 硬盘
在计算机发展的早期,硬盘的大小是很小的,所以历史上采用的分区表 MBR 由于技术限制,最大就只能支持到 2T,我们上一章用的 fdisk 划分出来的分区就是采用的 MBR 分区表.
后来的计算机发展太快,MBR 分区已经无法满足要求,GPT 分区就出来了。GPT 分区一般用 parted 命令来进行分区。
4.确认分区细节
1 | |
5.保存分区表
1 | |
6.分区完成
到这里我们分区做完了,但是这个时候我们还不能使用这个磁盘,可以看到同 sda 对比,他还没挂载到对应的目录。
1 | |
GPT 分区
1.准备 1 个 3T 硬盘
1 | |
2.开始分区
1 | |
3.打印磁盘信息
1 | |
4.创建 GPT 分区表
1 | |
5.创建分区
1 | |
6.分区完成
到这里我们分区做完,但是这个时候我们还不能使用这个磁盘,目前使用 MBR 和 GPT 的分区都是只属于分区完成,未使用的状态。
1 | |
挂载
开始之前,我们如何知道我们的分区是 MBR,还是 GPT 呢?
1 | |
在 Windows 里面我们格式化的时候,有 2 种文件系统:NTFS 和 FAT32。而在 Linux 系统里面目前用得最多的系统是 ext4 和 xfs,这里我们有 2 块盘分别用不同的方式进行格式化。在 ext4 前面当然还有 ext3,ext2。当然在其他类型的 Linux 里面也还有更多的文件系统。
1.格式化 ext4
1 | |
2.格式化 xfs
1 | |
3.挂载磁盘
前面说过,磁盘可以挂载到任何目录,但是系统自带的目录一般都是安装系统的时候就已经完成配置,一般都不要去动他。这里我们就创建 2 个新目录进行挂载。有挂载也就有卸载,卸载使用的命令是 umount。
1 | |
4.配置 fstab
如果挂载以后直接使用也没有问题,但是如果主动或者被动重启了系统,你会发现磁盘会被还原到未挂载的情况,那怎么实现开机自动挂载呢?这里就需要知道在 Linux 里面有下面这个一个文件,你的磁盘是否自动挂载都写到这里。
在刚刚挂载的时候,我们用的是直接用的是输入的设备地址,而下面配置文件写的是一串 UUID,他们之间有什么区别呢?我如何知道每个盘的 UUID 呢?这里需要知道一个命令 blkid,他会告诉你每个盘的 UUID。
他们之间有什么区别呢?每个盘的 UUID 是不会变的,所以用 UUID 是可靠的,但是如果用设备名字,这个是可能出现问题的,比如原来有 3 个盘,其中一个盘坏了,他们的盘符是可能会发生变化的,如果因为磁盘故障,外加重启就可能导致盘符出现变化,这个时候可能会出现我们意想不到的问题。
确认好怎么配置以后,参考上面的格式进行配置即可,配置完成以后最好重启一下,如果配置错误可以在还未开始应用的时候修复,避免正式使用以后遇到重启在引发的问题。
1 | |
1 | |
1 | |
inode&硬连接
“Inode” 是文件系统中一个重要的概念,特别是在类 Unix 操作系统中(如 Linux)。它是 “index node”
的缩写,用于存储文件或目录的元数据信息。每个文件和目录在文件系统中都有一个唯一的
inode,它包含了关于文件的重要信息,如文件的权限、所有者、大小、时间戳以及数据块的位置等。
Inode 的主要组成部分包括:
- 文件类型和权限: 文件类型(regular file、directory、symbolic link 等)和访问权限(读、写、执行)。
- 所有者和所属组:文件或目录的所有者和所属的用户组。
- 文件大小:文件占用的大小(以字节为单位)。
- 时间戳:包括文件的访问时间、修改时间和状态改变时间。
- 指向数据块的指针:存储文件数据的实际位置,这些指针可以直接指向数据块,或者在某些情况下,指向间接块、双重间接块和三重间接块。
Inode 的作用:
- 唯一标识:每个文件和目录在文件系统中由唯一的 inode 号码标识。
- 元数据管理:存储文件和目录的元数据信息,例如权限、所有者、大小等。
- 性能优化:通过 inode 可以快速访问和管理文件的元数据,从而提高文件系统的性能。
- 硬链接:硬链接是通过相同的 inode 号码连接到同一文件的多个文件名。这允许文件在文件系统中具有多个名称,但是只有一个物理副本,因为所有硬链接共享相同的
inode。 - inode 索引节点,存放文件属性信息,block 位置。
- 每创建 1 个非空文件至少占用 1 个 inode,1 个 block,一般文件都要有 1 个 inode。
- 1 个 block 默认是 4k。
- inode,block 数量是在格式化的时候创建的。
- 正常情况下 block 的使用会更快.
- 创建小文件不足 4k,1 个 block 还有剩余空间,无法给其他文件使用.
- 创建文件大于 4k,占用多个 block.
用户访问查看文件内容的流程:
- 用户访问文件的时候,系统会找出他对应的 inode 空间(根据 inode 号码)。
- 访问来到 inode 空间后,确认用户,确认权限。
- 权限信息正确就准许通过,可以访问 inode 对应的 block 区域(数据)
在 Linux 中,可以使用命令如 ls -i 来查看文件或目录的 inode 号码,或使用 stat 命令查看详细的 inode 元数据信息。
总结
- inode 简单理解就是从整个分区里面分割出来一部分空间,用来存储 inode 信息,大小是根据分区大小自定定义的。
- 如果没特需求不建议修改 inode 的大小调整。
- inode 也是有容量限制的,如果磁盘里面是大量的小文件,inode 就可能满的,这个时候也是无法写入文件的,也是普通运维最容易遇到的 inode 问题。
- 结合 find 命令,可以对那些无法使用 rm 命令删除的文件进行删除(目前为止也是我用过涉及到 inode 的两个地方)。
硬连接&软连接
硬连接(Hard
link)是操作系统中用来连接文件名与文件内容的一种技术,可以让一个文件拥有多个文件名(即多个硬连接)。硬链接与原始文件在文件系统中的 inode 相同,因此不同的文件名实际上引用了同一个文件内容,它们在系统级别上没有区别,只是文件系统为每个文件名维护了一个目录项。
软连接(Symbolic Link),也称为符号链接,是一种特殊类型的文件,它包含指向另一个文件或目录的路径。软连接类似于 Windows 系统中的快捷方式,它允许你创建一个指向另一个文件或目录的链接,而不是实际复制或移动文件本身。
| 特点 | 硬连接 (Hard Link) | 软连接 (Symbolic Link) |
|---|---|---|
| 定义 | 目录项指向相同的物理文件数据块。 | 特殊类型的文件,包含指向另一文件或目录的路径。 |
| 类型 | 文件系统层级的链接。 | 文件系统层级的链接。 |
| 跨文件系统 | 不能跨越文件系统。 | 可以跨越文件系统。 |
| 目标类型 | 只能链接到文件,不能链接到目录。 | 可以链接到文件或目录。 |
| inode | 与目标文件相同的 inode 号。 | 新的 inode 号,指向目标的路径。 |
| 链接计数 | 增加原始文件的硬链接计数。 | 不影响目标文件或目录的链接计数。 |
| 更新 | 如果原始文件被修改,所有硬连接都会同步更新。 | 软连接可以指向动态变化的目标。 |
| 删除原始文件 | 不影响硬链接,直到所有硬链接被删除。 | 软连接失效,称为悬空连接。 |
| 权限和所有权 | 与目标文件相同的权限和所有权。 | 有自己的权限和所有权。 |
| 用途 | 保护特殊文件,避免被误删除 | 常用于创建快捷方式或简化路径。 |
| 命令行创建 | ln targetfile linkfile ln -s targetfile linkfile |
硬连接需要删除所有的文件,才能最终把文件删除。
软连接可以使用普通 rm 命令删除,也可以使用 unlink 取消连接。
1 | |
- 软件连接是比较常用的,可以给文件,目录创建。
- 硬链接只能给文件创建,不能跨分区,无法给目录创建硬链接,较少使用。
- 删除软连接,源文件不受影响。
- 删除源文件,软连接无法使用,红底白字闪烁.
- 删除硬链接,源文件,软连接无影响
- 删除源文件和硬链接,这个文件就被删除了
df 命令
df 命令(磁盘空间使用情况查询)是一个常用于查看文件系统磁盘空间使用情况的命令。它能够显示指定文件系统的总空间、已使用空间、可用空间以及使用率等信息。
1 | |
du 命令
du 命令用于查看目录或文件的磁盘使用情况,即显示指定路径下文件和目录的磁盘使用量。它可以帮助你快速了解文件或目录占用的存储空间大小
1 | |
df 是从文件系统来统计的,du 是从文件来统计的,正常的情况下这这种统计数据是很接近的,有两种意外情况
- df 使用量远大于 du 统计数据量,这个问题是文件句柄未释放,重启系统可以解决
- du 统计数量已经超过 df 看到的磁盘总量,比如磁盘 20G,du 统计出来有 25G,这个时候可以添加-x 参数就可以规避掉这个问题(
主要出现在有 Docker 的环境 - df -h 如果卡住不输出,那么这个系统肯定是有问题的(常出现在 nfs 客户端,这个时候 nfs 服务端挂掉,nfs 客户端执行这个命令就会卡住)
Linux 网络相关
本文档会涉及到一些网络配置相关信息,如果要配置网络,需要先知道网卡的配置文件(在 Linux 里面一切皆文件,这也是 Linux 的思想之一)也会涉及到一些基础操作命令。
1.找到网卡配置文件
1 | |
2.默认网卡配置文件
1 | |
3.手工配置网卡文件
1 | |
4.重启网卡&服务
1 | |
5.配置文件解释
1 | |
6.总结
- 这个是比较常用的配置 ip 的方式,永久生效。
- 也可以通过命令直接配置,但是这个重启以后会丢失。
- ip 不仅可以配置单个,也可以配置多个。
- 设备名字都会省略”ifcfg-“,但是在 Linux 目录里面必须包含。
PING
ping 命令是网络诊断工具中最基础和常用的命令之一。它用于检查两台主机之间的网络连通性,并测量数据包的往返时间 (Round-Trip
Time, RTT)。
1 | |
总结
- icmp_seq=x 是发送请求编号,如果中途缺少一个,则说明包丢了。
- TTL 是 IP 数据包头部的一个字段,用于控制数据包在网络中的存活时间。简单点说 TTL 默认 64,离 64 越远,则经过的设备越多。
- time 是超时时间,一般本机都是是小于 1ms,一般局域网不会超过 10ms,全国同网一般不会超过 50ms。
- 判断 ping 就是判断是否丢包,延时是否不稳定。
- 一般情况下,能 ping 通,就代表网络的联通性是没问题的,但是也可能出现对方服务器限制了 ping 的原因。
- ping 通和端口通是完全没有任何关系的两件事。
TELNET
Telnet 是一种基于 TCP/IP 的远程登录协议,它允许用户从本地计算机远程访问和控制其他计算机。 也可以检查服务是否可以访问(间接得到服务是否运行)
1 | |
总结
- telnet 只支持 TCP 协议,不支持 UDP 协议。
- telnet 不仅用于探测端口是否畅通,还可以用于登录网络设备(交换机等)。
- telnet 不仅用于探测端口是否畅通,还可以用于登录某些特殊服务(不常见)。
- ping 和 telnet 实际运维中都会组合到一起使用,但是切记他们之间是没有必然关系的,因为他们使用的网络协议都是不一样的。
命令 echo > /dev/tcp/192.168.179.107/22
是一种利用 Linux 系统中的特性来尝试与远程主机进行 TCP 连接的方式。这种方法通常用于快速检查目标主机的网络可达性,特别是在没有安装 ping 或 telnet 等网络工具时
具体解释如下:
- /dev/tcp/192.168.179.107/22 是 Linux 中的一个虚拟设备文件路径,它允许通过文件 I/O 来操作网络套接字。
- echo 命令在这里被用来向指定的 TCP 套接字发送数据。
- > /dev/tcp/192.168.179.107/22 表示将空字符串(即空数据)通过 TCP 连接发送到目标 IP 地址 192.168.179.107 的 22 端口(SSH 端口)。
- 注意事项
- 是否能够使用: 这种方法的可用性取决于 Linux 系统内核的配置。在某些较新的 Linux 发行版中,默认情况下可能会禁用 /dev/tcp 和
/dev/udp 虚拟文件系统。此外,某些安全策略也可能会限制对这些设备文件的访问。 - 仅用于检查连接性: 上述命令通常只用来检查目标主机是否可以访问指定的端口。它并不会建立一个真正的 SSH 连接或发送任何有意义的数据。
- 替代工具: 更好的做法是使用专门的网络工具来进行连接测试,如 ping、telnet、nc(netcat)等,它们提供了更多的控制和信息反馈,能够更精确地确认网络连接的状态和问题。
- UDP 探测:由于 UDP 是无状态的,所以无论对方的端口是否在监听,我们都可以把包发出去,所以我们无法知道对方是否正在监听
- 是否能够使用: 这种方法的可用性取决于 Linux 系统内核的配置。在某些较新的 Linux 发行版中,默认情况下可能会禁用 /dev/tcp 和
权限组
Linux 操作系统的用户体系非常灵活,这使得它成为了一个很好的多用户系统。它有三种类型的用户:超级用户(root),系统用户和常规用户。
- 超级用户 (root)
:在 Linux 系统中,超级用户是权限最高的用户,被称为根用户,也就是 root 用户。超级用户可以执行任何命令,包括系统设置、软件安装、用户和权限管理等。root 用户的权限等同于 Windows 系统中的管理员权限。 - 系统用户:系统用户主要是为了运行某些服务或者守护进程(daemon)而创建的。这些系统用户通常不会具有登录 shell,也就是说,它们不能直接登录系统。例如,邮件系统会有一个名为
mail 的系统用户,网页服务器可能会有一个名为 www 或 http 的用户。
常规用户:这些用户是进行日常工作的用户,他们可以登录系统并运行各种应用程序。但是,他们不能对系统进行修改,也不能访问其他用户的文件,除非这些文件被明确地赋予了访问权限。你在安装 Linux 系统后创建的第一个用户就是常规用户(也可以不创建),通常这个用户会被赋予使用 sudo 命令的权限,也就是说,这个用户可以执行一些需要 root 权限的命令。
在 Linux 系统中,每个用户都有一个唯一的用户 ID(UID),系统内部通过 UID 来识别用户。UID 0 通常被赋予 root 用户,UID
1-999 一般为系统用户,1000 以上的 UID 用于常规用户。
用户命令
- useradd [options] username:创建新的用户。例如 useradd -m username 将会创建一个新的用户,并创建用户的主目录。
- passwd username:设置或修改用户的密码。不加用户名则默认修改当前用户,只有 root 可以修改其他用户的密码。
- userdel [options] username:删除用户,默认不会删除家目录和相关文件。例如 userdel -r username 将会删除用户以及用户的主目录。
- usermod [options] username:修改用户的信息。例如 usermod -l newname username 将会修改用户的用户名。
- groups username:显示用户所属的组。
- id username:显示用户的 UID(用户 id)、GID(用户组 id)以及所属的组。root 的 uid 是 0,虚拟用户 uid<1000,普通用户 uid >= 1000
- su username:切换到其他用户。例如 su - username 将会切换到用户,并加载用户的环境变量。
- whoami:显示当前的用户名。
- who:显示当前登录的所有用户。简写 w
- last:显示系统的登录记录。
- lastlog 所有用户最近 1 次登录情况
用户管理
1 | |
/etc/passwd 存放用户信息。文件中的每一行都代表系统上的一个用户账号,每行由多个字段组成,字段之间使用冒号(:)分隔。典型的字段包括:
- 用户名:用户的登录名。
- 密码占位符:(在现代系统中通常是 x)原本是存储加密的密码,现在通常是存储在 /etc/shadow 文件中,或者指向其他安全存储的文件。
- 用户 ID (UID):唯一标识符,用于系统内部识别用户。
- 组 ID (GID):该用户所属的主要组的标识符。
- 用户描述:一般是用户的全名或注释。
- 主目录:用户登录后所处的初始目录。
- 登录 Shell:用户登录后默认使用的 Shell 程序。
1 | |
/etc/shadow 存放密码信息。文件用于存储用户账号的加密密码、密码过期信息以及账号是否被锁定等敏感信息。相比于 /etc/passwd
文件,它具有更高的安全性,因为普通用户无法直接读取此文件。
文件结构:
- 用户名:与 /etc/passwd 中的用户名对应。
- 加密密码:使用密码哈希算法加密后的密码。实际密码不会直接存储在此处,只存储其哈希值。
- 密码最后更改日期:自 Unix 时间戳起,距离上次更改密码的天数。
- 密码更改最短天数:两次密码更改之间的最小天数间隔。
- 密码更改最大天数:密码的有效期,超过此期限用户需要强制更改密码。
- 密码过期前警告天数:密码即将过期前,提前多少天发出警告。
- 账号失效日期:账号失效的日期,即停止使用该账号的日期。
- 账号标志:包含有关账号当前状态的其他信息,例如是否被锁定等。
- 每一行对应一个用户账号,字段之间用冒号(:)分隔。
- 访问权限:/etc/shadow 文件具有非常严格的访问控制,通常只有 root 用户或具有相应特权的用户能够读取和修改此文件。这是为了确保用户密码和账户信息不被未经授权的用户获取。
- 如果自己是一个普通运维角色,我们能拿到的账号和密码,应该是一个普通用户和密码。
- 如果自己是运维管理员的情况,则分配给其他人的账号也只能是一个普通账号。
- 普通用户可以可以通过 su 及 sudo 命令来提升自己的权限,用于完成需要超级管理员权限才能完成运维的操作。
- 当然,这并不是标准方案,你可以根据自己的实际情况选择。
- 有的应用程序则要求必须使用非 root 用户启动,比如 es,使用 root 则会被提示不允许使用 root 启动。
用户组介绍
在类 Unix 操作系统(如 Linux、FreeBSD 等)中,用户组是用于管理和组织用户的一种机制。以下是关于用户组的基本介绍:
- 定义:
- 用户组是一组用户的集合,它们可以共享相同的权限和访问控制设置。每个用户都可以属于一个或多个用户组。
- 用途:
- 权限管理:用户组是控制文件和系统资源访问权限的重要机制。通过用户组,系统管理员可以轻松管理多个用户对文件和目录的访问权限。
- 共享资源:用户组允许一组用户共享相同的资源,这在团队和组织环境中特别有用。
- 管理简化:通过组织用户到不同的组中,系统管理员可以更有效地分配和管理用户权限,而不必为每个用户单独设置权限。
- 特性:
- 主组:每个用户在创建时会有一个主组,通常与其用户名相同。这个主组是用户在文件系统上创建文件和目录时的默认所属组。
- 附加组:用户可以同时属于多个附加组,这些组可以授予用户访问其他资源的额外权限。
- 管理工具:
- groupadd:用于创建新的用户组。
- groupdel:用于删除现有的用户组。
- groupmod:用于修改用户组的属性,如名称或 GID(组 ID)。
- gpasswd:管理用户组的密码(组密码)。
- groups:显示当前用户所属的所有组。
- 其实还有 2 个涉及权限的命令也可以操作文件和目录的组权限。
- 在 Unix/Linux 系统中,管理用户组的主要工具包括:
- 文件:
- 用户组信息通常存储在 /etc/group 文件中。这个文件包含了所有用户组的列表,每个用户组一行,由冒号(:)分隔的字段构成,包括组名、组密码(通常是
x)、组 ID(GID)和组成员等信息。
- 用户组信息通常存储在 /etc/group 文件中。这个文件包含了所有用户组的列表,每个用户组一行,由冒号(:)分隔的字段构成,包括组名、组密码(通常是
- 权限:
- 文件和目录的权限可以分配给用户组,这允许组内的所有成员共享特定的读、写、执行权限。通过组权限的设置,管理员可以实现更精细的权限控制和资源管理。
- 在实际运维中,其实组这个概念用得是比较少的,我到目前为止都还没用过,大家作为一个了解吧。
- 在小型的系统是很难用到组概念的,大型系统都会通过其他堡垒机方式来实现管理,并不需要针对单独的 Linux 服务器配置组策略。
/etc/group 存放用户组信息
/etc/gshadow 存放用户组密码信息,几乎不会给用户组设置密码
Linux 的权限介绍
在 Linux 系统中,每个文件和目录都有一个访问权限,用来保护数据的安全。这个权限分为三类,分别对应三种不同的用户:
- 文件拥有者(User):创建该文件或目录的用户。
- 用户组(Group):文件拥有者所在的用户组,用户组中的用户可以共享某些权限。
- 其他用户(Other):除了文件拥有者和用户组内的用户之外的其他用户。
每种用户都有以下三种权限:
- 读取权限(Read):用户可以读取文件的内容或列出目录的内容。用“r”表示,对应数值 4。
- 写入权限(Write):用户可以修改文件的内容或在目录中创建和删除文件。用“w”表示,对应数值 2。
- 执行权限(Execute):用户可以执行文件,或者进入和查看目录的内容。用“x”表示,对应数值 1。
例如,如果一个文件的权限被设置为”755”,那么对应的权限是:
- 文件拥有者:7(即 4+2+1)拥有读、写、执行权限
- 用户组:5(即 4+0+1)拥有读、执行权限
- 其他用户:5(即 4+0+1)拥有读、执行权限
可以使用 chmod 命令来改变文件或目录的权限,使用 chown 命令来改变文件或目录的所有者,使用 chgrp 命令来改变文件或目录的用户组。
1 | |
在 Linux 系统中,有一些特殊权限和文件属性,它们可以进一步控制文件和目录的访问和行为。这些特殊权限和属性通常通过文件的权限位(文件属性)和文件属性位(文件系统特性)来实现。
1.Setuid、Setgid 和 Sticky Bit
Setuid (SUID):当文件设置了 SUID 权限后,执行该文件的用户将暂时获取文件所有者的权限。在执行过程中,该用户的权限将提升到文件所有者的权限级别。
示例:chmod u+s filename,使用 ls -l 查看时,文件权限会显示为 -rwsr-xr-x。
这个权限最典型的就是 passwd 这个命令,这样 root 用户可以用它修改自己的密码,而其他普通用户也可以通过这个命令修改自己的密码。所以它的权限就是-rwsr-xr-x
Setgid (SGID):当文件设置了 SGID 权限后,执行该文件的用户将以文件所属组的身份运行。对于目录,则表示新建文件和目录将继承父目录的组权限。
示例:chmod g+s filename,使用 ls -l 查看时,文件权限会显示为 -rwxr-sr-x。
Sticky Bit:常用于目录上,设置了 Sticky Bit 后,只有文件所有者、目录所有者或超级用户可以删除或移动文件,即使其他用户对该目录有写权限。
示例:chmod +t directory,使用 ls -ld 查看时,目录权限会显示为 drwxrwxrwt。
2.ACL(Access Control List)
ACL:Access Control List,即访问控制列表,允许用户对文件或目录设置更为精细的权限控制,可以控制多个用户或组对文件或目录的访问权限。
设置 ACL:setfacl 命令用于设置 ACL,如 setfacl -m u:user:rwx filename。
查看 ACL:getfacl 命令用于查看 ACL,如 getfacl filename。
3.文件属性
Immutable (i):设置了文件的不可变属性后,即使是超级用户也不能修改或删除该文件,直到该属性被取消。
设置不可变属性:chattr +i filename。
取消不可变属性:chattr -i filename。
Append-only (a):设置了文件的追加属性后,只能向文件中追加内容,不能删除或修改文件的已有内容。
设置追加属性:chattr +a filename。
取消追加属性:chattr -a filename。
SSHD
我们前面讲了如何 ssh 登录,都是使用的密码,其实在 ssh 登录里面还有几个经常遇到的问题,比如我能否不使用 ssh 密码,而是用一种免密的方式登录(
目前一般的公有云平台创建新的云主机都可以选择使用密码还是密钥的),而且 ssh 端口默认都是 22,是否可以修改,如果为了安全,是否可以不允许 root 登录。
免密码登录
先普及 2 个概念,在免密登录的时候一般会涉及到 2 个文件,一个私钥,一个公钥,他们是配对的。私钥就是放本地服务器里面,公钥就是放到我们想要免密登录的服务器里面,如果从我们从云平台开通主机的时候,选择密钥登录,则会获得一个文件,它就是私钥。如果你不愿意用系统给你生成的,你也可以上传你自己定义好的公钥。
在实际运维中,部分软件是要求配置免密登录才能更好运行,甚至必须要免密才能运行。还有就是可以给服务器设置一个自己都不记得甚至空密码的情况下,然后使用密钥登录来提高安全性。
配置免密登录
生成公钥及私钥
1 | |
查看公钥和私钥
1 | |
把公钥传输其他服务器
1 | |
查看远程服务器的公钥
1 | |
验证免密登录
1 | |
总结
- 这里所有的操作都是基于 root 账号来操作的,实际上也可以普通账号来配置免密。
- 把私钥拿到 win 也可以登录成功服务器,使用 ssh 软件,选择密钥登录也可以使用。
- 如果不做任何操作的情况下,它同时支持密码和密钥两种方式。也就是我可以拿密钥去登录,也可以拿密码去登录。
- 同一个服务器,允许配置多个公钥,让不同的私钥都可以使用免密登录。在实际 authorized_keys 文件里面就是体现有多行。
- 使用密钥登录可以避免密码被撞库的可能性,从而提高系统安全性。
22作为所有人都知道的 ssh 端口,它只要暴露在互联网,就会不停的面临暴力破解。我们最常用的做法就是修改端口,以及禁止 root 用户登录,使用一个普通账号登录,然后再使用 sudo
或者 su 方式来满足自己的运维需求。
修改 SSH 端口
1 | |
禁止 root 登录
1 | |
禁止密码登录,只允许密钥登录
1 | |
总结
- 修改端口,禁止 root 登录,只允许使用密钥,在实际运维中,可以根据自己需要进行选择一种或者多种组合。
- 当然实际情况下 sshd 的能够支持的配置还有很多,比如限制 ip,或者只允许特定的用户或者组登录。
- 还有一个经常修改的参数是 UseDNS ,把它修改成 no 可以加速 ssh 登录行为(这个里面涉及到一个 dns 概念,反向解析)。
- ssh 在 Linux 服务器里面一般涉及到 2 个操作:一个是作为 sshd 的服务端,也可以是 ssh 作为连接其他人的客户端命令。
主机名与 hosts
Linux 系统中的主机名通常是指在网络中标识一个特定主机的名称。主机名在 Linux 中有几个不同的用途和设置方式:
主机名的作用:
- 网络标识: 主机名是在网络中唯一标识你的 Linux 服务器或计算机的名称。它可以用来让其他设备和服务器识别和访问你的机器。
- 系统配置:主机名通常用于配置文件中,例如 /etc/hostname 文件保存系统当前的主机名。
- 命令行显示:当你登录到 Linux 系统的命令行终端时,主机名通常会显示在提示符中,以便你知道当前所在的主机,如果在部署的时候,没有配置,默认的主机名则是 localhost
1 | |
HOSTS 在计算机网络中,hosts 是一个重要的文件,它用于将主机名与 IP 地址进行映射,从而实现域名解析的功能。具体来说,hosts
文件通常位于操作系统中的一个特定位置(在大多数 Unix-like 系统中是
/etc/hosts),用于存储静态的 IP 地址和主机名映射关系。windows 系统也有一样的文件,他的位置是:C:
\Windows\System32\drivers\etc\hosts。
hosts 文件的作用:
- 域名解析:hosts 文件最主要的作用是将主机名(例如 example.com)映射到相应的 IP 地址(例如
192.0.2.1)。这种映射允许计算机通过主机名快速找到相应的 IP 地址,以便建立网络连接。 - 本地主机名解析:hosts 文件中可以包含本地主机的名称映射,比如将 localhost 映射到
127.0.0.1。这样做可以确保系统在没有 DNS 服务器或者在 DNS 服务不可用时,仍能够访问本地主机。 - 加速访问:使用 hosts 文件可以加速对经常访问的域名的解析,因为系统会首先检查 hosts 文件中的记录,避免了每次都向 DNS 服务器查询。
总结
- 一般情况下主机名可用于标注主机信息,让我们看到主机名字,就知道它是哪台机器,避免因为主机名字都相同而出现执行错误的指令(
不同的主机主机名是可以可以一样的,只要他们之间不使用主机名通信即可,比如默认所有机器主机都是 localhost)。 - hosts 可以用于模拟真实的域名解析,用于测试验证部分网络情况。比如在测试环境使用和真实环境使用一样的域名,来测试业务,就可以通过配置 hosts 来实现。
- 有一些集群软件,比如 MQ,HDFS 他们之间的通信是基于域名或者说主机名来通信的,这个时候我们需要配合主机名和 HOSTS 的合理配置,才能正常搭建这些软件。
- 主机可以可用来标识业务名字,也可以用来标识 IP 地址,具体根据需求灵活掌握即可。
ENV
在 Linux 系统中,环境变量扮演着非常重要的角色,用于配置系统和应用程序的运行环境。Linux 环境变量可以影响命令行会话、运行的程序以及整个系统的行为。以下是一些常见的 Linux 环境变量及其作用:
1 | |
常见的 Linux 环境变量
- PATH:作用:定义了系统在哪些目录中搜索可执行文件。
- HOME:作用:指定当前用户的主目录路径。
- LANG 和 *LC_:作用:定义了系统的语言和区域设置。
- TMP 和 TEMP:作用:指定临时文件的存储路径。
- PS1:作用:定义命令行提示符的格式。
- JAVA_HOME:作用:指定 Java 开发工具的安装路径。
- LD_LIBRARY_PATH: 作用:指定动态链接库(shared library)的搜索路径。
- HISTSIZE: 作用:定义 histsize 的保存上限数量。
设置和使用环境变量
在 Linux 系统中,可以通过以下方式设置和使用环境变量:
- 查看环境变量:使用 echo 命令可以查看当前 Shell 中定义的环境变量,如 echo $PATH 可以显示 PATH 的值。
- 在 Shell 中临时设置:可以直接在 Shell 中使用 export 命令来设置环境变量,例如:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64这样设置的环境变量仅在当前 Shell 会话中有效,关闭 Shell 后失效。
- 在 Shell 中临时设置:可以直接在 Shell 中使用 export 命令来设置环境变量,例如:
- 查看环境变量:使用 echo 命令可以查看当前 Shell 中定义的环境变量,如 echo $PATH 可以显示 PATH 的值。
- 永久设置
- 永久设置的方式是设置到文件里面,主要涉及到下面几个文件
- 用户级别:~/.bash_profile 或 ~/.profile 文件用于每次打开新的 Shell 会话时加载的配置。这里定义的环境变量通常也只对当前用户有效。
- 系统级别:/etc/profile 或 /etc/environment 文件用于设置系统全局的环境变量,这些变量对系统中所有用户和进程都有效。
- 设置以后,都要重新登录才会生效,如果要在当前 shell 生效,则要执行:
source /etc/profile
总结
- env 可以查看当前环境有哪些环境变量
- ~代表是家目录,比如 root 的家目录是/root,如果是 user1 的家目录则是/home/user1
- 在 Linux 里面以点”.”开头的文件或者目录就是隐藏文件,常规的 ll 或者 ls 都是看不到文件的,需要使用 ls -a 才可以看到。
- 在前面用户我们讲 su 命令的时候说过,su -l 或者 su - 的时候会加载用户环境变量,加载的就是这里的的用户级别配置文件下的内容。
- 二进制软件包,可以通过添加环境变量的方式来直接访问,也可以直接放置到 PATH 对应的目录。比如最常见的 JDK,一般都是通过把路径添加到环境变量里面然后访问。
- 环境变量的优先级确实是按照命令行设置 > 系统级别 > 用户级别的顺序。这意味着通过命令行直接设置的环境变量会优先于系统级别和用户级别的配置文件中的定义。
- 实际上以上那么多环境变量相关的配置文件,如果临时用,我就在命令行里面添加,要永久使用的,我都是写到/etc/profile 这个文件里面。
Linux 定时任务
在 Linux 中,可以使用 crontab 来设置和管理任务计划。crontab 是一个用于定期执行命令或脚本的工具,可以按照指定的时间间隔自动运行任务。
1 | |
优先级说明
这五个时间单位的优先级从左到右依次降低。根据这五个时间单位的取值,可以设置不同的定时任务。例如:
- 如果在分钟、小时、日期、月份和星期几的位置上都使用了星号(*),表示任务将在每分钟都执行。
- 如果在分钟位置上使用了特定的数字,而其他位置上使用了星号(*),表示任务将在每小时的特定分钟执行。
- 如果在小时位置上使用了特定的数字,而其他位置上使用了星号(*),表示任务将在每天的特定小时执行。
- 如果在日期位置上使用了特定的数字,而其他位置上使用了星号(*),表示任务将在每月的特定日期执行。
- 如果在月份位置上使用了特定的数字,而其他位置上使用了星号(*),表示任务将在每年的特定月份执行。
- 如果在星期几位置上使用了特定的数字,而其他位置上使用了星号(*),表示任务将在每周的特定星期几执行。
请注意,星号(*)表示通配符,意味着该时间单位的所有取值都适用。而特定的数字表示具体的取值,例如 1 代表 1 号,2 代表 2 点等。
根据具体需求,可以根据时间单位的优先级来设置 crontab 任务的时间间隔。请确保设置正确的时间间隔,以确保任务按预期执行。
每分钟,用 *
每 2 分钟,则用*/2
每 5 分钟,则用*/5
其他依次类推,绝大部分任务都是在分钟和小时 2 个参数进行调整。
主要用途
- 定时切割日志,删除文件
- 检查进程存活
- 定期备份
总结
- Linux 任务计划的规则其实很简单,只要理解到规则就可以根据自己的需要编写对应的规则。对应的规则可以直接是命令,也可以是脚本。
- Linux 任务计划是分用户的,尤其是多用户运维的服务器。
- Linux 任务计划最小粒度是分钟,如果需要更精细的角度来执行,可以通过把命令放置到脚本里面,然后通过脚本来实现秒级的粒度的控制。
- 在前面讲文件搜索的时候,我们讲过 Linux 有自带的几个目录,里面放置的就是根据单词提示的执行任务。这里的任务,通过
crontab -l
命令都是看不到的。如果有任务计划未按照预期执行,可以检查 cron.deny 。
1 | |
软件安装
很多命令,默认最小安装的情况下,都是不自带的,都需要额外安装,那我们应该如何安装这些软件呢?
- yum 安装
- yum 命令安装的软件仅仅局限于红帽系列,主要包括以下几类操作发行版:RHEL,Fedora,CentOS,Rocky 等。
- 安装:打开终端,输入 yum install packagename ,其中 packagename 是你想要安装的软件包的名称。比如,如果你想安装
wget,那么命令就是 yum install wget。 不过很多时候会加上-y 参数来替代确认的动作。yum -y install wget。 - 卸载:输入 yum remove packagename,其中 packagename 是你想要卸载的软件包的名称。比如,如果你想卸载 wget,那么命令就是 yum
remove wget。一般卸载用的基本不用,因为它会卸载一些依赖软件,可能导致其他软件不能正常使用。 - 升级:输入 yum update packagename,其中 packagename 是你想要升级的软件包的名称。如果你想更新所有的软件包,只要输入 yum
update 即可。 - 无论是安装,升级,都必须是基于服务器仓库里面有这个软件才可以的,如果没有则无法安装或升级的。
- RPM 安装软件
- 其实前面 yum 安装的软件格式都是 rpm 格式的,只是 yum 是从网上下载的包来安装,而部分包是在网上的仓库里面是没有的,或者没有网络环境就可以使用 rpm 包进行安装。
- 安装:输入 rpm -i packagefile.rpm,其中 packagefile.rpm 是你的 RPM 包的文件名。个人习惯是 rpm -ivh
xxx.rpm,用于显示过程。vh 参数也适合卸载和升级。 - 卸载:输入 rpm -e packagefile.rpm,其中 packagefile.rpm 是你的 RPM 包的文件名。
- 升级:输入 rpm -U packagefile.rpm,其中 packagefile.rpm 是你的 RPM 包的文件名。
- 编译安装
- 编译安装适用于源码包,它不仅适合红帽系列,也适合其他 Linux 操作系统。以下是基本的编译安装步骤:
- 解压源码包,一般使用 tar -xvf packagefile.tar.gz 命令。
- 进入解压后的目录,一般使用 cd directoryname 命令。
- 配置,一般使用 ./configure 命令。你可以添加参数来定制你的安装,比如指定安装目录 –prefix=/usr/local/xxx。
- 编译,使用 make 命令。
- 安装,使用 make install 命令。
- 以上步骤可能会因软件不同而有所改变,应根据具体的 README 或 INSTALL 文件进行操作。
编译安装最难的问题是依赖问题,比如我要编译安装软件 A,但是它依赖 B,C,D 等,但是它一次只显示一个错误。而且 B,C,D 还有依赖,甚至出现循环依赖 A 依赖 B,B 依赖 A 的情况。
所以编译安装每完成一步,请通过 echo $? 打印出来上一条命令的执行结果,必须是”0”才进行下一步。
总结
- 在实际运维过程中,一般用 yum 最多,rpm 次之,编译安装目前已经使用很少了。这里实际上还衍生出来另外 2 个问题,我怎么知道我去哪里下载包(本地配置 xxx.repo 配置),服务器里面有些啥(yum 源)。
- 在 centos 里面,yum update 会升级 centos 的版本,举个例子:如果我当前的版本是 centos 7.5 ,但是最新的 centos 的版本是 centos7.9,当我执行 yum
update 以后就会把整个系统的版本升级到 centos7.9。所以这个命令一般是在安装完成系统的时候进行系统初始化的时候就需要完成的,一般情况下,如果业务已经部署上去了,一般就不建议再执行该命令。 - 编译安装技能属于很有用,但是平时很少用到的技能,比如最近的 OpenSSH 严重的 CVE-2024-6387 漏洞,虽然 OpenSSH 早就发布了修复漏洞版本,但是他们发布的都是源码包,如果没有直接可用的安装包,就需要自己进行编译安装。
- 可以利用 yum 只下载不安装的特性,把下载的 rpm 包传递到需要安装的环境里面使用 rpm 包进行安装。
YUM
YUM 源配置
在 Linux 有一个目录,/etc/yum.repos.d/这里的配置文件指定了 yum 命令去那个仓库下载文件。
1 | |
本地源
下面是在 CentOS 等基于 RPM 的 Linux 发行版中配置本地 Yum 源的步骤:
- 挂载安装介质:首先,你需要将你的 CentOS 安装光盘(或 ISO 文件)挂载到某个目录,比如/mnt/cdrom。你可以使用以下命令来挂载:
1 | |
- 创建
.repo
文件:接下来,你需要在/etc/yum.repos.d/目录下创建一个新的.repo 文件,比如 myrepo.repo。你可以使用文本编辑器来创建和编辑这个文件。在这个文件中,你需要指定你的本地 Yum 源的名称、描述、路径等信息。
1 | |
- 清除 Yum 缓存
- 测试本地 Yum 源
局域网源
- 准备一台服务器:首先,你需要准备一台可以作为 Yum 服务器的机器,它需要有一定的硬盘空间来存放软件包,同时需要安装 HTTP 或 FTP 服务器软件,用于提供网络访问。
- 挂载并复制软件包:然后,把 CentOS 的安装光盘挂载到这台服务器上,我们就借用上小节的/mnt/cdrom 目录。把所有文件复制到一个目录下,例如/mnt/centos7。
- 因为 iso 或者光盘是只读的,而配置源会产生文件,所以需要复制出来单独的目录,而不能复用原来的只读目录。
- 安装 createrepo:接下来,安装 createrepo 工具,这个工具可以创建 Yum 源需要的元数据信息:
yum install -y createrepo - 创建 Yum 源元数据:然后在存放软件包的目录下创建 Yum 源的元数据:
createrepo /mnt/centos7 - 配置 HTTP 或 FTP 服务器:根据你的实际情况,配置 HTTP 或 FTP 服务器,使其可以提供对/mnt/centos7 目录的访问。由于这里还没有讲 web 服务器,所以过程就略过。
- 在客户端配置 Yum 源:最后,在局域网内的其他机器上,你需要修改/etc/yum.repos.d/目录下的.repo 文件,将 baseurl 设置为你的 Yum 服务器的地址,为了避免干扰,需要把其他 repo 文件移走。
1 | |
- 运行 yum clean all 和 yum list 命令:如果能列出软件包,说明 Yum 源已经配置成功。
总结
- 我们需要掌握的就是如何更换源,知道有些什么源可以更换,其实在实际运维中,不仅只有 centos 系需要源,其他系统也需要,甚至某些软件也需要更换源,比如 pip,nodejs。
- 掌握对于某些特殊软件,比如 Docker,Mysql 等软件源的更换方法。
/etc/yum.repos.d/目录下哪些文件,和仓库的也是对应关系的,有兴趣的可以下去了解下。- 我们可以搭建本地 iso 源或者局域网源来满足 yum 命令的使用。
- 前面 2 个源,我们依赖的都是 iso 文件,但是这里的 iso 文件都是比较老的,我们可以通过去同步公网源来保持数据的及时性。
- 这里搭建的都是 centos7 的 iso,那么能否搭建支持多个源的服务器呢?当然是可以的,这里需要稍微调整下目录即可。
- 如果 yum 源对应的服务器,不能上网,我们又该怎么办呢?
- 我们如何才能把服务器的源同步下来呢?总不能一个一个的下载把,这里其实有个 rsync 协议可以直接源里面指定的目录文件都下载下来,这个后期会单独讲这个命令。
时钟同步
ntp
任何一台电脑都会有一个本地时间的,由于 CPU 物理特性,它会越走越慢,如果我们管理着很多的服务器,但是他们的服务器时间不一样,这样会给我们业务带来问题的,现在很多业务对时间都非常敏感,所以我们必须保证我们的服务器的时间是一致的。
NTP,全称是 Network Time
Protocol,即网络时间协议。它是用来同步网络中各个计算机的时钟的协议,使得网络中的计算机可以有一个一致的时间。它能够提供精确到亚秒级的时间同步,并且可以在计算机之间自动进行时间校对,以消除时钟漂移。
NTP 常用于银行、股票交易、航空、电信等需要精确时间的领域,也是网络服务如 email、数据库等应用的重要组成部分。
进行 NTP 配置是为了保证网络中的所有设备能够同步到准确的时间,这对于许多应用和服务来说是非常重要的。
- 数据一致性:许多系统和应用依赖时间戳来跟踪事件或数据的更改。如果时间不一致,可能会导致数据错误或冲突。
- 日志分析和故障排查:如果网络中的设备时间不一致,分析日志和故障排查会变得复杂和困难,因为无法准确知道事件发生的顺序。
- 安全性:许多安全协议和技术(如 Kerberos 或 SSL)都依赖于准确的时间。如果时间不准确,可能会引发安全问题,或者导致服务无法正常运行。
- 高精度应用:一些高精度应用(如科学研究、金融交易等)需要非常准确的时间同步。
- 法规合规:某些行业(如医疗、金融等)有法规要求对事件的时间进行精确记录。
配置 NTP
- 安装 ntp 软件
yum -y install ntp - 配置 ntp `
#默认是centos官方的ntp服务器,可以根据需要更换
vi /etc/ntp.conf
#启动ntp
systemctl start ntpd
systemctl enable ntpd3. 检查 ntp 同步状态ntpq -pn`
NTP 说明
在没有安装 ntp 软件包的时候,我们如果要修改时间,只能通过 date 命令,直接来设置时间,但是这个时间设置随意性太强,不是很严谨。
通过 yum 安装 ntp 包以后,会安装出来 2 个命令,一个就是上图用到的 ntpq,主要用于 ntpd 状态查询;另外一个就是 ntpdate,它可以用户同步其他 ntp 服务器的时间。
1 | |
总结下来,安装 ntp 软件包以后,我们有 2 种方式可以去同步时间,一个是使用 ntpdate 命令去同步,一个是通过 ntpd 服务方式去同步。
如果是使用 ntpdate 去同步,则需要配合我们前面讲到的任务计划(crontab),因为 ntpdate 执行同步,执行的是一次性任务。而使用的 ntpd 是以服务方式,是自动同步的。
NTP 服务端
上面我们讲的 ntpd 也好,还是 ntpdate 也好,实际上都是作为 ntp 客户端的,但是我们有很多服务器,都处于内网,并且是不能上网的,他们是无法连接到公网的,所以我们就需要给这些内网的服务器搭建一个内网的 ntp 服务器,作为服务端给下游其他机器提供 ntp 服务。
如果我们选择作为 ntp 服务器的服务器,是可以通公网的,那么他只要按照服务方式启动 ntp 服务就可以作为 ntp 服务器,ntp 服务是一个特殊服务,他既可作为服务端,也可以作为客户端。其他 ntp 客户端机器只要把 ntp.conf 里面的 ntp 服务器地址换成我们选定的服务器就可以。
如果我们选择的 ntp 服务器是没有上网能力,就只能以自己的时间作为标准,向下游提供服务。
- 修改配置文件
1 | |
- 服务端检查 ntp 服务状态
1 | |
- 客户端检查 ntp 服务状态
1 | |
总结
- ntp 使用很简单,但是在超大规模的情况下要想保证整个环境的稳定和可靠还是有很多事情需要做的。
- 上面的配置只考虑验证基本功能,并没有考虑到时间误差过大会发生什么,ntp 并没有高可用等问题。
- 另外 ntpq -pn 下面的很多参数也没有讲解是啥意思,有兴趣可以自己去查下。
- 我本人也有多年维护某大厂私有云平台 ntp 服务的经验,如果有兴趣可以和我交流。
- ntp 服务是不怕故障的,ntp 怕的是时间跳变。
chrony
其实在 NTP 时间同步协议里面常用的软件有 2 个,一个就是上小节讲的软件 ntp,另外一个就是本小节要讲的另外一个软件 chrony,这 2 个软件都有类似的功能,目前国内的公有云厂商,有的厂商给用户提供的 ntp,有的给用户的提供的 chrony。
这 2 个软件,在默认情况下是互斥的,也就是只能同时启动一个,后启动的会把先启动的服务给停止掉。甚至默认情况下 ntpdate 命令和 ntpd 服务都是互斥的就算他们是一个软件包安装出来的,也就是 ntpd 服务在运行的时候,ntpdate 命令我是无法执行的。
chrony 在最小化安装的 centos7 系统里面都是自带的,如果不配置就和 ntp 一样,都是使用官方默认的源。
1 | |
总结
- 无论是 ntp 还是 chrony,他们使用的协议都是 udp,而不是一般常用的 tcp 协议,这个需要注意。
- 作为服务端,我要考虑他怎么给客户端提供稳定可靠的服务(高可用,防止跳变)。
- 作为客户端,我需要考虑的就是如果服务端故障(chrony 其实不怕故障),或者说服务端时间发生跳变,我怎么来降低他对我的影响。
DNS 服务
通过 hosts 是可以跳过 dns 解析的,那什么是 dns,为什么要有 dns 呢?
DNS,全称是“Domain Name System”或者叫“域名系统”,是互联网的一种服务。它作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,而不用去记住能够被机器直接读取的 IP 数串。
在互联网上,每个接入网络的设备都会被分配一个唯一的 IP 地址,你可以把它理解为互联网上的电话号码。当你想访问一个网站时,你的电脑实际上是向该网站服务器的 IP 地址发送请求。然而,IP 地址是一串数字,对人类来说记忆起来相对困难。这时候,DNS 就派上了用场,它的作用就是将这串数字的 IP 地址转换成更易于记忆的域名,比如 Linux 自带的默认情况下 localhost 就代表本机 IP 地址。
Linux 解析流程
- 用户请求:用户在应用程序(比如浏览器、命令行等)中输入域名,例如 www.example.com。
- 查找本地缓存:但是这个缓存,默认情况下是看不到的。我通过抓包测试连续两次 dns 查询,也都是需要向 dns 发出请求的。所以我对这个缓存其实一直都是存疑的,但是实际运维中也确实遇到过解析异常的情况。
- 查询/etc/hosts 文件:如果在本地缓存中找不到对应的 IP 地址,系统会检查 /etc/hosts
文件,这个文件可以手动配置域名和 IP 地址的映射关系。如果在这里找到了,也会直接返回 IP 地址给应用程序。 - 向 DNS 解析器发起查询:如果本地缓存和 /etc/hosts 文件中都没有找到对应的 IP 地址,系统会向预先配置的 DNS 解析器发起查询请求。DNS 解析器通常在
/etc/resolv.conf 文件中指定,例如:
1 | |
- DNS 解析器查询过程:
- 这里的 dns 服务器可以分为迭代和递归两种:
- 迭代查询:在迭代查询中,当客户端向 DNS 服务器查询时,如果该服务器没有存储查询的信息,它会将能够提供信息的其他服务器的地址返回给客户端,让客户端去那个服务器查找。也就是说,DNS 服务器不会自己去查询,而是告诉客户端应该去哪里查找。
- 递归查询:在递归查询中,当客户端向 DNS 服务器查询时,如果该服务器没有存储查询的信息,它会代表客户端去其他服务器查询,直到找到答案才返回给客户端。在这个过程中,客户端只需要等待最终结果,所有的查询工作都由 DNS 服务器完成。
- 总结下来其实很简单,迭代自己没有答案,但是他会告诉你哪里有答案。递归他帮你去找到答案,然后告诉你答案。目前大部分 dns 都是递归。
- 解析结果返回: DNS 解析器将获取到的 IP 地址返回给系统的 resolver,并且缓存这个结果。同时,将 IP 地址返回给应用程序,应用程序可以继续向该 IP 地址发送网络请求。
- 应用程序通信: 应用程序拿到 IP 地址后,可以与目标服务器建立通信,发送 HTTP 请求等操作。
Linux 的 dns 配置文件
前面讲过 linux 的 dns 配置文件是/etc/resolv.conf,他除了配置了 dns 服务器,还有其他配置,分别是什么意思,如果遇到解析失败他怎么办?
- nameserver :就是 dns 服务器地址,最多可以写 3 个。
- search:搜索域,一般环境用不到,但是在 k8s 里面会搜索 svc 的时候会用到这个特性。大概意思就是你查询一个域名,如果没查到解析,他再给你添加个后缀,再进行查询。
- options:
- timeout 如果在设定时间未返回数据,则他会请求下一个 dns 服务器查询。
- attempts: 如果所有 dns 都查询了都失败了,他在重复这个操作的次数。
- 如果你的 dns 解析很慢,可以注意看这 2 个参数。
总结
- Linux 的 dns 是一个很核心的基础服务,几乎所有的业务请求都是通过域名来实现,这样所有的请求都会通过 dns 才能正常使用。
- 有的程序并不会使用系统 dns 逻辑,而是程序自带的 dns 逻辑,这样就可能导致业务和实际预期不一样的情况。
搭建私有 dns 服务器
基本命令
- ping:最简单的使用方式,也是使用最多的方式。
- nslookup:比 ping 有更多的功能。
- dig:比 nslookup 更新的支持更广泛的命令
- dig 命令和 nslookup 命令在最小化安装的系统里面都是默认不自带的,需要安装包 bind-utils 才有这 2 个命令
在内部环境,有些会使用一些自定义的域名,用户指向某些内部服务,在各个公有云基本都有内网 dns 这个产品,道理其实是一样的。然后如果其他域名,他无法解析,他则可以通过递归的方式去请求上游 dns 服务器,然后返回给用户。这里就涉及 2 个配置:一个是递归到上游服务器,另外一个提供内部 dns 解析服务。
- 安装 dns 软件:dns 软件其实也有很多,我们这里以 unbound 来举例。
yum -y install unbound - 配置 dns 转发
1 | |
- 配置私有域名
1 | |
- 配置服务端
1 | |
总结
- 这里的配置实现了 unbound 的两大核心功能,内部域名和递归转发。
- 核心功能还有很多,比如缓存,比如用户请求了 qq.cm,dns 可以把结果缓存到自己内部,如果有人再次来请求他,就直接返回给他,而不用在向上递归查询。
- 实际运维可以经常更新的内部域名放到/etc/unbound/local.d/目录下,运维起来会更轻松。
NFS 服务
NFS(Network File System)是一种分布式文件系统协议,用于在网络上共享文件和目录。它允许多个计算机系统通过网络访问和共享存储在远程文件服务器上的文件。
搭建 nfs
nfs 服务分服务端和客户端,在公有云里面,厂商负责提供服务端,客户端(虚拟机)只要有对应的命令就可以正常挂载使用。
服务端搭建
- 安装 nfs 软件
yum install nfs-utils -y - 配置 nfs
1 | |
- 更新配置
exportfs -r - 启动 nfs
1 | |
客户端部署
- 部署 nfs 软件
yum install nfs-utils -y- #服务端和客户端其实需要安装的软件是一样的
- #只是服务端需要配置如何提供服务,而客户端不需要,和 ntpd 其实比较类似
- 创建测试目录
mkdir /test - 测试挂载
- #具体 ip 和路径以实际配置为准
mount -t nfs 192.168.0.239:/home /test
- #具体 ip 和路径以实际配置为准
NFS 配置参数
在 NFS 配置中,有一些常见的参数需要设置。以下是一些常用的 NFS 配置参数:
- 导出目录(Export Directory):指定要在 NFS 服务器上共享的目录路径。例如,/home/nfs_share。
- 允许访问的客户端(Allowed
Clients):指定可以访问 NFS 共享的客户端地址。可以使用单个 IP 地址、子网掩码或者通配符来指定客户端。例如,192.168.1.0/24 表示允许所有在 192.168.1.0/24 子网中的客户端访问。 - 访问权限(Access Permissions):指定对共享文件的访问权限。可以设置读取、写入和执行权限。例如,rw 表示读写权限,ro 表示只读权限。
- 同步选项(Sync Option):指定 NFS 服务器的同步选项,即文件写入的同步方式。可以设置为 sync(同步写入)或 async(异步写入)。同步写入会导致写入操作变慢但较安全,而异步写入会提高性能但可能会有数据丢失的风险。
- 导出选项(Export Options):提供其他选项来控制 NFS 共享的行为。例如,no_root_squash 用于禁止将 root 用户映射到匿名用户,no_subtree_check 用于禁用子树检查等
总结
- nfs 的服务端会监听很多端口,如果有防火墙的时候要注意端口策略。
- nfs 客户端如果是自动挂载,要考虑 nfs 服务端异常可能导致机器无法启动。
- 如果在运行中,nfs 服务端异常,则客户端机器也会跟着异常。
- 客户端异常表现是负载很高,df 命令会卡住。
- 在客户端使用之前,可以使用命令确认服务端是否正常。
showmount -e 192.168.31.107
LVM
LVM(Logical Volume Manager,逻辑卷管理器)是一种在 Linux 系统上管理磁盘存储的高级工具。它允许用户管理和控制存储设备,通过创建逻辑卷(Logical
Volumes,LVs)和卷组(Volume Groups,VGs),来更灵活地管理存储空间的分配和使用。
- 物理卷(Physical Volume,PV):物理卷是 LVM 管理的基本单元,通常是一个磁盘分区或整个物理磁盘。物理卷必须先初始化为 LVM 格式才能被
LVM 管理。 - 卷组(Volume Group,VG):卷组是由一个或多个物理卷组成的逻辑集合。卷组提供了一个抽象层,使得多个物理卷能够被统一管理和分配。
- 逻辑卷(Logical Volume,LV):逻辑卷是卷组内的虚拟分区,它们可以被格式化成文件系统,并像物理磁盘上的分区一样使用。逻辑卷的大小和数量可以根据需要动态调整。
- 简单来说就是 pv 就是原始硬盘,vg 就是把几个原始硬盘组合到一起,lv 就是把组合到一起硬盘划分出来使用。
创建 lvm
- 安装 lvm 命令
yum install lvm2 - 准备磁盘
1 | |
- 创建 pv
1 | |
- 创建 vg
1 | |
- 创建 lv
1 | |
- 格式化&挂载
1 | |
- 扩容&缩容
1 | |
总结
- 无论是分区还是磁盘都可以作为 lv 加入到 lvm 里面使用,但是原始里面的是数据会丢失。
- lvm 一句话概括就是创建 pv,组成 vg,然后再分成 lv 使用。
- 这里只简单写了 lvm 的基本创建和使用功能,里面还有很多命令并没有讲。
- 在 centos7 安装过程中,在磁盘分区的时候,如果不对磁盘做任何操作,默认就是以 lvm 格式安装操作系统。
- 有些分布式系统,对文件系统是有一定要求的,lvm 是不满足要求的。
SELinux
SELinux(Security-Enhanced Linux)是一种安全增强型的 Linux 安全子系统,由美国国家安全局(NSA)开发,旨在增强 Linux 系统的安全性。它通过实施强制访问控制(MAC)来提供高级的安全保护机制。
具体来说,SELinux 引入了一种额外的安全层,不同于传统的自由访问控制(DAC)。在 DAC 中,每个文件、进程或用户可以自行设定权限,并且用户可以超越其他用户拥有更高权限。这可能导致安全漏洞,因为任何一个受损的进程都可以访问系统上的任何资源。
虽然 SElinux 很安全,但是在实际运维中,除了特殊要求,一般都会关闭 selinux。因为如果要使用 Selinux,软件或者应用程序需要很复杂的配置才可以。
1 | |
库文件
我们在介绍如何让 Docker 镜像最小化的时候,有提过以下这个库文件,在平时使用也是不容易感知到这个库文件的。在 Linux 基本目录介绍的时候,也说过有 2 个目录:/lib
/lib64 是库文件目录,存放系统动态链接库和内核模块。
在 Linux 的哲学里面一切皆文件里面,我们对 Linux 的操作实际上就是对文件进行增删查改,这些基础功能底层逻辑就是各种函数,相当于系统把这些功能封装在各种函数里面,供应用程序去调用。
- 文件读写函数:如 fopen、fclose、fread、fwrite 等,用于打开、关闭、读取和写入文件。
- 终端输入输出函数:如 printf、scanf、fgets、fputs 等,用于从终端读取输入和输出结果。
- 系统调用函数:如 read、write 等,用于直接与文件描述符进行交互,提供更底层的文件操作能力。
这些上面的函数都集成在系统的库文件里面如果我们自己开发的程序能力,就需要使用到这些库文件,这就是动态库,供操作系统的程序调用。和动态库对应的就是静态库。所以静态库,就不只依赖自己,完全不依赖系统自带的库文件。
1 | |
总结
- selinux 如果不使用,一般都需要在系统进行初始化或者制作通用模板的时候就把永久关闭掉。
- 库文件一般只有在进行某些软件的编译安装的时候会涉及到库文件因为版本不对导致异常的清空。
SWAP
Swap 是计算机系统中用于暂时存放内存数据的一种技术。它通常指的是交换空间(swap
space),是一种虚拟内存的扩展,用于在物理内存不足时将不活动的内存页从 RAM(随机存取存储器)移动到硬盘上的一部分空间。这样,RAM 中可以腾出空间来加载当前需要的数据和程序。
目前来说,对于动辄几百 G,甚至上 T 的内存面前,swap 已经基本没有使用的必要了,但是在互联网早期,内存都很低的情况,swap 是提高系统性能的一种重要方法。而且在 centos7 安装的时候无论默认的 lvm 还是标准分区,都会单独拿一块分区出来用作 swap。只是随着内存的提高,就算开启了 swap 也会关闭 swap 功能,而且 k8s 这个软件在某些版本里面默认情况下,如果有 swap 还无法启动成功。
- 关闭 swap
swapoff -a - 开启 swap
1 | |
总结
swap
,如果没开则不需要管,如果开启了,也可以在初始化的时候进行关闭,看 swap 是否正常,其实主要看他的动态变化,如果变化大,说明内存和磁盘在进行大量数据交换,会影响性能。如果变化很小或者几乎没有变化,则说明使用不频繁则不会有啥问题。- 在内核里面还有个参数,可用于 swap 的介入程度,数字越小,就是让 swap 介入越低。
Linux 日志
message 日志
在 Linux 系统中,message 日志通常指的是系统日志(system
logs)中的一部分,这些日志记录了系统和应用程序的各种信息、警告和错误。message 日志也是我们在日常运维中查看使用最最频繁的日志,没有之一。是属于文本格式的日志,可以直接用 Linux 操作普通文件的命令来分析。主要记录以下日志
- 系统启动和关机信息:记录系统何时启动和关机,以及相关的详细信息。
- 服务启动和停止信息:记录各种系统服务(如网络服务、数据库服务等)的启动、停止或重启的信息。
- 内核消息:包括关于硬件、驱动程序和内核的运行时消息。
- 一般的系统运行消息:例如系统运行时的一般信息、警告和调试信息。
日志基本信息
- 日志路径:/var/log/message
- 日志格式: 文本格式
- 查看方法:普通查看文件命令,tail cat vi 等命令
1 | |
总结
- message 日志是最重要的分析系统情况的日志,没有之一。
- message 日志记录的字段里面记录,时间,主机名,用户(用这个用户可以更明显的确认日志来源)
- 这个用户有 kernel,systemd,journal,应用程序(docker,nginx 这些)
- 分析系统崩溃,程序启动失败等都会用到他
- 甚至在根分区磁盘不够的情况下,首先要删除的也是 message 日志
- 参与 logrotate 的日志轮转进行更新,避免把磁盘打满。
secure 日志
在 Linux 系统中,secure 日志是系统日志的一部分,主要用于记录与系统安全相关的活动和事件。一般情况下,我们没有安全相关的需求是不会分析这个日志的,这个日志主要记录一下几个方面的内容。
- 用户登录和认证:
- 记录用户登录系统的事件,包括成功和失败的登录尝试。
- 记录用户使用的认证方法,如密码、SSH 密钥等。
- sudo 使用记录:
- 记录使用 sudo 命令进行特权操作的用户和时间。
- 记录特权操作的成功和失败情况。
- 安全策略变更:
- 记录安全策略的修改,如用户权限的变更、密码策略的更新等。
- 系统服务启动和停止:
- 记录系统服务的启动、停止或重启的信息,这些操作可能会涉及到特权操作或安全相关的服务。
- 防火墙和安全组规则:
- 记录防火墙(如 iptables)或安全组(如 ufw)规则的变更或拒绝的尝试。
- 系统安全事件:
- 记录系统可能遭受到的攻击或异常行为,如登录失败的暴力攻击尝试、拒绝服务攻击的迹象等。
日志基本信息
- 日志路径:/var/log/secure
- 日志格式: 文本格式
- 查看方法:普通查看文件方法:tail cat vi 等命令
总结
- 该日志主要主要是和安全登录相关,只要暴露了攻击面,就会被暴力破解。
- 当然只要没有人恶意连续大量的连接,一般情况下倒是可以忽略不计的。
- 当然从安全的角度来说,我们需要减少暴露面,强密码来保证服务器的安全。
btmp 日志
在 Linux 系统中,btmp 日志是系统日志的一部分,它记录了所有登录失败的尝试,包括失败的登录用户名、登录失败的时间以及登录失败的来源
IP 地址。
- 记录失败登录时间:准确记录每次错误登录发生的时间,精确到秒甚至更小的时间单位。这对于分析在特定时间段内是否存在异常的登录活动非常重要。例如,如果在凌晨时分出现了大量不正常的登录尝试,可能意味着存在潜在的安全威胁,如黑客试图暴力破解密码。
- 登录用户信息:记录尝试登录的用户名。通过分析频繁被尝试登录的用户名,可以确定哪些账户可能成为攻击目标。如果某些具有管理员权限的用户名被频繁尝试登录,就需要特别关注并加强相关账户的安全措施。
- 登录来源信息:在某些情况下,还可能记录登录尝试的来源 IP 地址。这对于追踪可能的恶意攻击者的位置或识别来自特定网络区域的异常活动很有帮助。如果发现某个
IP 地址不断尝试错误登录多个账户,就可以将该 IP 地址列入黑名单或采取其他相应的安全措施。
日志基本信息
- 日志路径:/var/log/btmp
- 日志格式: 二级制格式
- 查看方法:使用专用命令 lastb
总结
- 这个日志也是属于平时关注比较少的日志,如果未开放到公网或者限制比较严格,这里应该只有很少记录。
- 如果没有暴露面,也确实不用怎么关注他。
- 如果暴露到公网,我们可以根据上面的情况做一些针对性的限制(比如错误达到几次就自动屏蔽)。
wtmp 日志
在 Linux 系统中,wtmp 日志是系统日志的一部分,它主要用于记录系统的登录和注销等相关信息。这个刚好和 btmp 相对应,一个记录失败,一个记录成功。
- 记录登录和注销时间:它准确地记录了用户登录到系统的时间以及注销的时间。这对于跟踪用户的活动时间以及系统的使用情况非常重要。例如,管理员可以通过查看
wtmp 日志来确定某个用户在特定时间段内的登录时长,从而了解用户对系统资源的使用情况。 - 记录用户身份信息:wtmp 日志会记录登录用户的用户名等身份信息。这有助于管理员识别哪些用户在何时访问了系统。在多用户环境中,如果出现了系统问题或安全事件,通过查看
wtmp 日志可以快速确定当时登录的用户,以便进一步调查相关情况。 - 记录登录终端和来源信息:它还可能记录用户登录的终端设备(如本地终端、远程登录的终端类型等)以及登录的来源 IP
地址(如果是远程登录)。这对于了解用户的登录方式和位置很有帮助。例如,如果发现某个用户经常从不同的 IP
地址登录,可能需要进一步核实该用户的身份和活动是否正常。
日志基本信息
- 日志路径:/var/log/wtmp
- 日志格式: 二进制格式
- 查看方法:使用专用命令 last
总结
- 该日志主要记录成功的日志,如果服务器运行的时间越长,他记录的信息越多。
- 当日常运维中需要查询某个命令是谁执行的就可以通过 history 和该记录进行综合分析。
- 该日志记录的用户,来源 ip,登录时间,登出时间。
lastlog 日志
在 Linux 系统中,lastlog 日志是系统日志的一部分,主要用于记录每个用户最后一次登录时间的日志文件。
- 跟踪用户登录情况:
- 它记录了每个系统用户最后一次成功登录系统的时间。这对于管理员了解用户对系统的使用频率和最近的活动情况非常有帮助。例如,如果某个用户长时间没有登录,管理员可以检查该用户是否仍然需要该账户,或者是否存在账户闲置浪费系统资源的情况。
- 通过对比不同时间点的 lastlog 记录,可以发现用户登录行为的变化。比如某个用户原本每周都会登录,突然连续几周没有登录记录,可能意味着该用户的工作职责或使用需求发生了改变。
- 安全监测:
- 在安全方面,lastlog 日志可以作为一种监测手段。如果发现某个用户的最后登录时间与预期不符,比如用户声称自己没有登录过,但
lastlog 显示有近期的登录记录,这可能表明该用户账户存在安全风险,可能被他人盗用。 - 对于新创建的用户,lastlog 初始时是没有记录的。当该用户首次登录后,lastlog 会记录下登录时间。这样管理员可以通过查看
lastlog 来确定新用户是否已经开始正常使用系统,以及是否存在异常的首次登录情况(如在不应该的时间或地点登录)
- 在安全方面,lastlog 日志可以作为一种监测手段。如果发现某个用户的最后登录时间与预期不符,比如用户声称自己没有登录过,但
日志基本信息
- 日志路径:/var/log/lastlog
- 日志格式: 二进制格式
- 查看方法:使用专用命令 lastlog
总结
- 他会统计 linux 所有的用户(/etc/passwd)里面的所有用户,无论他们是否有登录权限
- 有些服务,比如 nginx,默认是不允许交互登录的,如果你尝试使用了 su 命令去切换登录,这里也会记录你登录。
- btmp,wtmp,lastlog 这 3 个命令都是二进制格式,都是记录 Linux 登录相关的日志。
cron 日志
cron 日志
- 任务的执行时间:可以确切知道定时任务在何时被触发执行。
- 任务执行结果:判断任务是否成功完成。如果任务失败,日志中可能会包含相关的错误信息,帮助你定位问题。例如,如果是脚本执行错误,可能会显示脚本的具体错误输出。
- 资源使用情况(某些情况下):有些更详细的日志可能会包含任务执行时的资源使用情况,如 CPU 占用、内存使用等,但这通常需要更高级的日志配置或特定的工具来分析。
日志基本信息
- 日志路径:/var/log/cron
- 日志格式: 文本格式
- 查看方法:普通查看文件方法:tail cat vi 等命令
总结
- 这个日志就是查看任务计划的执行情况。
- 如果你的设置了任务计划,未按照你的预期执行,你可以来查看该日志,确认任务计划是否执行过(是否执行成功是另外一回事)。
sar 日志
可能从严格意义来说,sar 并不能算 linux 日志,他应该属于 linux 监控工具。
sar (System Activity Reporter) 是 Linux 操作系统中的一个实用工具,用于收集、报告和保存系统活动信息。sar 是 sysstat
套件的一部分,能够监控和报告各种系统性能指标,包括 CPU、内存、磁盘 I/O、网络等。
前面几个日志由于记录的内容相比较单一(message 除外,但是查看很简单)由于 sar 记录了非常的多的内容,而且 sar 只是一个命令,他就会很多的参数来查看不同类型的监控指标。
日志基本信息
- 日志路径:/var/log/sa(目录)
- 日志格式: 二进制格式
- 查看方法:使用专用命令 sar
- 安装方法:yum -y install sysstat
1 | |
总结
- 默认最小化安装是没有这个命令的,可以安装这个命令来替代部分监控的作用。
- 在历史业务异常的时候,也可以通过查看历史监控信息来分析可能存在的问题。
journal 日志
journal 是 Linux 系统中的系统日志管理工具,它是 systemd 的一部分,提供了一个集中的方式来收集、管理和查看系统日志。journal
相比传统的 syslogd 和 rsyslogd 等日志系统,具有更强的功能和灵活性。
所以,简单来说:journal 并不是日志,而是日志管理工具。
- 统一的日志存储:
- 它将来自不同来源的日志信息集中存储在一个统一的日志系统中。这包括内核日志、系统服务日志、应用程序日志等。不再像传统的
Linux 日志系统那样分散在多个不同的文件中(如/var/log/messages、/var/log/syslog
等)。例如,当系统启动时,内核的初始化信息、各个服务的启动过程以及应用程序的相关事件都可以在 Journal 中连贯地记录下来。 - 这种统一存储使得查找和分析日志更加方便。你不需要在多个不同的文件中切换查找相关信息,只需要在 Journal 日志中进行搜索即可。
- 它将来自不同来源的日志信息集中存储在一个统一的日志系统中。这包括内核日志、系统服务日志、应用程序日志等。不再像传统的
- 高效的存储和访问方式:
- Journal 采用了基于数据库的存储方式,能够快速地写入和检索日志信息。它使用了索引和优化的数据结构,相比传统的基于文本文件的日志系统,在处理大量日志数据时具有更高的性能。
- 当你需要查询某个特定时间段内的日志或者搜索特定关键词时,Journal
能够快速地定位并返回结果。例如,在排查一个在特定时间点发生的系统故障时,可以迅速找到该时间附近的相关日志记录。
- 支持多种日志格式:
- Journal 可以处理不同格式的日志信息,包括文本格式和结构化数据格式。对于一些现代的应用程序和服务,它们可以将更丰富的结构化数据写入
Journal,这样在分析日志时可以获取更多的细节信息。 - 比如,一个网络服务可以将连接的 IP 地址、端口号、请求的时间等结构化信息作为日志记录在 Journal 中,方便管理员进行更精确的分析和监控。
- Journal 可以处理不同格式的日志信息,包括文本格式和结构化数据格式。对于一些现代的应用程序和服务,它们可以将更丰富的结构化数据写入
日志基本信息
- 日志路径:/var/log/journal(目录)
- 日志格式: 二进制格式
- 查看方法:使用专用命令 journalctl
1 | |
总结
- 这里只是简单说了下 journal 的日志使用方法,具体还有很多功能都没说明。
- 从前面的日志我们其实可以看到 journal 和 message 和 cron 等日志是有重叠的,其实我一般都很少看这个日志。
- 很多服务启动失败,会直接提示你使用 journal 命令查看。
dmesg 日志
在 Linux 系统中,dmesg 是一个用于查看内核环形缓冲区(kernel ring buffer)内容的命令。它主要记录了系统启动时的内核信息以及内核在运行过程中的一些关键事件和错误等。
dmesg 的作用
- 系统启动信息:
- dmesg 可以显示系统启动过程中的详细信息,包括硬件检测、驱动初始化等。例如,当系统启动时,它会显示关于 CPU
型号、内存大小、硬盘识别等信息。这对于了解系统硬件配置和排查启动问题非常有帮助。 - 比如,在启动过程中,如果某个硬件设备没有被正确识别,dmesg 中可能会有相关的错误提示,帮助你确定问题所在。
- dmesg 可以显示系统启动过程中的详细信息,包括硬件检测、驱动初始化等。例如,当系统启动时,它会显示关于 CPU
- 内核事件和错误记录:
- 它记录了内核在运行过程中的各种事件,如设备的连接和断开、驱动的加载和卸载等。同时,也会记录内核错误和警告信息。
- 例如,如果某个设备驱动出现问题,可能会在 dmesg 中看到相应的错误代码和描述。这有助于系统管理员和开发者快速定位内核相关的问题。
日志基本信息
- 日志路径:/var/log/dmesg
- 日志格式: 文本格式
- 查看方法:可以使用文本方式,也可以使用 dmesg 专用命令
1 | |
总结
- 其实一般没有硬件问题,这个日志是很少用到的。
- 如果不加任何参数,则日志记录的时间是从开机启动的时间计算,如果要方便人类识别则加参数。
dmesg -T
kdump 日志
在 Linux 基础-系统安装的时候,我们曾经在部署介绍说 kdump 功能,那什么是 kdump 呢?
kdump 是一个用于在 Linux 系统中进行内核崩溃转储的工具和机制。它允许系统在发生严重内核问题或崩溃时,捕获并保存内核转储文件(core
dump),以便后续分析和故障排除。
- 主要功能和用途:
- 捕获内核转储文件:kdump
的主要功能是在系统遇到严重的内核问题、panic 或崩溃时,能够捕获当前内核的状态并将其保存到预先配置的文件系统中。这些转储文件包含了导致崩溃的内核、内存和进程信息,有助于后续进行故障分析和修复。 - 保护关键系统数据:当系统遇到崩溃时,常规的日志和调试工具可能无法正常工作。kdump
提供了一种在系统崩溃时仍能获取关键数据的方法,避免了信息丢失和无法复现问题的困难。 - 提供可靠的故障诊断工具:使用 kdump,系统管理员可以通过分析生成的转储文件来确定崩溃原因,查找相关的软件缺陷或硬件问题,并采取相应的修复措施。
- 集成和配置:kdump 需要事先进行配置才能正常工作。管理员需要为其指定一个用于保存转储文件的合适的文件系统分区,并确保系统在崩溃时能够自动触发 kdump
的操作。
- 捕获内核转储文件:kdump
日志基本信息
- 日志路径:/var/crash(目录)默认为空,因为崩溃了才有
- 日志格式: 二进制格式
- 查看方法:需要专用命令或者工具才能分析
总结
- 需要确保 kdump 功能的打开,或者配置正确,在系统崩溃的时候才会记录日志。
- kdump 需要专门的内存,在系统安装的时候可以选。
- kdump 文件一般比较大,需要预留足够的空间,避免空间不够大,导致生成日志失败,我见过都是几十 G。
- kdump 可以提前测试模拟崩溃,避免配置导致 kdump 无法生成。
- 已知内核 bug,或者硬件故障可能会出发系统崩溃而产生 kdump 日志。
- kdump 需要专业工具和专业人员才能分析,至少我是不会分析的。
- 手工让系统崩溃
echo c > /proc/sysrq-trigger
总结
从功能来区分,主要包括系统日志(message 和 journal);登录日志(btmp,wtmp,lastlog);安装相关(secure);内核相关(dmesg 和 kdump)
;任务计划日志 cron;监控日志 sar。
从使用频率来分,message 和 journal 日志属于使用较多,其他日志则相对较少(这个可能和个人习惯有关)。
从日志格式来分,又分为文本格式和二级制格式。
从生成方式来分,有的日志只系统运行就有,有的则要系统崩溃才有。
有的日志是有 systemctl 方式运行进程的,比如 cron,kdump,rsyslog,还有些是某些进程控制的,我们只需要了解即可,并不需要特别搞清楚他们的逻辑关系。
shell
故障
常见故障
- 文件和目录类
- File exist 文件已经存在
- No such file or directory 没有这个文件或目录(这个东西不存在)
- command not found 命令找不到(没有这个命令)
- invalid option 无效的参数(不可用的参数)
- overwrite 覆盖
- remove regular empty file 是否删除普通文件(空的)?
- is a directory xxx 是一个目录
- descend into directory 是否进入目录
- Invalid level 无效的层数,层数必须大于 0
- Can’t open file for writing 无法打开这个文件
- No write since last change
- xx column window is too narrow 窗口只有 xx 列太窄了 无法完全显示
- xxx not a directory 不是一个目录
- 查看压缩包的时候报错
- You have mail in /var/spool/mail/root
- permission denied
- Warning: Changing a readonly file
- ‘readonly’ option is set (add ! to override)
- cp: omitting directory ‘/oldboy/’
- unexpected end of file 或 Unexpected EOF in archive
- gzip: stdin: not in gzip format 压缩包不是 gzip 格式或压缩包损坏
- 网络连接类
- 远程连接错误 Connection Failed 连接失败
- yum 安装软件故障提示 Could not resolve host 无法解析主机
- yum 安装软件提示:Nothing to do (没事做)
- 没有找到叫 treea 的软件包
- Name or service not known 域名无法识别(无法上网)
- No route to host 没有访问主机的路由(此路不通)
- Connection Refused 连接拒绝
- 修改系统基础配置类
- 重启网卡报错 device not present
- 修改主机名过程中,命令行中主机名没有变化
- hostname 命令修改主机名(临时 重启服务器之后失效)
- 命令行中的主机名部分没有改变?
- 用户相关错误
- user ‘oldboy’ already exists
- no such user
- Only root can do that.
- Only root can specify a user name.
- Creating mailbox file: File exists
- warning: the home directory already exists.
- /etc/sudoers: syntax error near line 105 <<<
- 脚本及定时任务
- no crontab for root 没有配置定时任务
- no crontab for root - using an empty one 没有定时任务,创建空的定时任务
- crontab: installing new crontab 更新定时任务配置
参考资料
- 物理服务器介绍
- 鸟哥 linux 相关书籍
- linux 基础(然而一点也不基础)
- linux 服务器架设
- 鸟哥私房菜(全)
- 微信公众号运维小路
- 老男孩云计算
启示录
富贵岂由人,时会高志须酬。
能成功于千载者,必以近察远。