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 workstationvirtual boxwsl、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
2
3
4
5
6
7
8
9
10
biosdevname=0 net.ifnames=0
# 安装centos的时候 命令中添加以上配置内容,用于修改网卡名字 ensxxx -->eth0 eth1

# 根据需求选择,一般是server版
#官方源
http://isoredirect.centos.org/centos/7/isos/
#阿里源
https://mirrors.aliyun.com/centos/7/isos/x86_64/
#腾讯源
https://mirrors.cloud.tencent.com/centos/7/isos/x86_64/

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连接进去的。

正文

Linux 基础知识

命令相关

1
2
3
[root@machinname ~]#
#[用户@主机名 当前目录]#
# ~代表当前目录 后面的#代表root用户 $代表普通用户 主机名务必要修改,如果不修改默认是localhost

linux命令格式:command option arguments/parameter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
命令 Linux下面通过命令控制整个系统。(一般是单词或缩写)
选项 option,同一个命令的不同的功能执行命令的时候可以加上的条件。
参数 argument/parameter命令处理的目标

命令不会怎么办?
1. 上网查
2. man 命令 查询帮助
3. 命令 --help 查询帮助 简洁
4. info 帮助 详细
5. help 查询linux内置命令

linux快捷键
ctrl + a 光标移动到行首
ctrl + e 光标移动到行尾
ctrl + u 把光标所在位置到行首的内容剪切
ctrl + k 把光标所在位置到行尾的内容剪切
ctrl + l 清屏
ctrl + c 取消当前命令

ctrl + s linux是锁屏,win是保存
ctrl + q 解锁
ctrl + z linux是后台挂起当前命令,win是撤销

tab 自动补全命令
  • 关机命令
1
2
3
4
shutdown (-c 取消) (-h 指定时间,单位分钟后 now 10) 
halt
poweroff
init 0
  • 重启
1
2
3
shutdown -r null / now / 10
reboot
init 6
  • cd & pwd
1
2
3
4
5
6
7
8
9
10
11
12
cd change directory 进入到某个目录
pwd print working directory显示当前所在位置(以绝对路径方式显示)

回到家目录
cd ~
cd
上级目录
cd ..
上次目录
cd -
进入当前目录
cd .
  • mkdir
1
2
3
mkdir make dir directory
-p 创建多级目录
-v 显示目录创建过程,工作中基本不用
  • touch
1
2
3
4
5
6
7
8
touch 创建文件
-a:仅修改文件的访问时间(atime)。
-c:如果文件不存在,则不创建新文件。
-m:仅修改文件的修改时间(mtime)。
-r:使用指定文件的时间戳信息来设置目标文件的时间戳。
-t:使用指定的时间戳来设置文件的时间戳。

touch test.txt test.sh
  • vi

linux文件编辑器。提vi之前必须得先提提vim,vi可以理解是早期的版本,vim是升级版本,具备更多的功能,但是vim在默认的Centos最小化安装是不会自带的,需要单独安装软件包vim-enhanced

主要区别是以下几个方面:vim支持可视化、语法高亮、自动补全、支持多级撤销和重做、插件支持、执行外部命令、分屏编辑、搜索和替换功能

Vi 编辑器有三种主要的工作模式,它们是命令模式(Command Mode)、插入模式(Insert Mode)和底线命令模式(Last Line
Mode)。每种模式都有不同的功能和用途。

  • 命令模式:执行多种操作
    • 移动光标
      • 直接通过小键盘就可以上下左右移动
      • G :到文件末尾
      • gg: 到文件开头
      • 0: 到行首(数字0)
      • $: 到行尾
      • :set number: 显示行号
      • :行号:直接定义到某某行,比如 :10 就是到第10行
    • 删除
      • x:删除光标所在位置的字符。
      • dd:删除光标所在行
    • 复制和粘贴
      • yy:复制当前行。
      • p:粘贴
    • 搜索
      • /:开始向下搜索。
      • ?:开始向上搜索。
    • 撤销和重做
      • u:撤销上一步操作。
      • Ctrl + r:重做。
  • 插入模式:输入、编辑文本
    • 进入方式
      • i:在当前光标位置插入文本。
      • a:在光标后的位置插入文本。
      • o:在当前行的下方新建一行并进入插入模式。
    • 退出插入模式:
      • 按下 ESC 键,返回到命令模式。
  • 底线命令模式:执行文件保存、退出 Vi 等操作
    • :w 保存文件。
    • :q 退出 Vi。
    • :wq 或 ZZ 保存文件并退出 Vi。
    • ! 强制操作,不单独操作,组合使用,用于强制退出或者强制保存退出。
  • 模式切换
    • 从命令模式切换到插入模式,按下 i、a 或其他插入命令。
    • 从插入模式切换到命令模式,按下 ESC 键。
    • 从命令模式切换到底线命令模式,按下 : 键。
    • 从底线命令模式切换到命令模式,按下 ESC 键。
1
2
vi # 如果文件不存在,则也会创建一个文件

  • ls
1
2
3
4
5
6
7
8
9
10
11
12
13
ls list
-l 长格式显示,显示详细信息
-t 按照时间排序
-r 逆序
-h 人类可读形式
-a all
-R 递归列出
--color=auto 多色彩显示

ls /etc

ls -l /etc
一般简写为ll ll /etc
  • mv
1
2
3
4
5
6
7
8
9
10
mv [选项] 源文件 目标文件
mv move

-i:在移动或重命名前进行交互式确认,避免意外覆盖文件。
-f:如果目标文件已存在,则强制移动或重命名,覆盖已存在的文件。
-v:显示详细的移动或重命名信息,展示操作过程。
--backup[=CONTROL]:在移动或重命名文件时,根据 CONTROL 控制备份行为。

mv /home/user1/test.txt /home/user2/test.txt
mv 命令既可以用于移动文件或目录,也可以用于重命名文件或目录
  • cp
1
2
3
4
5
6
7
8
9
10
11
12
cp [选项] 源文件 目标文件
copy
-a all = -dpr
-i 在复制前进行交互式确认,避免文件覆盖。
-r/R 递归复制
-p 复制时保持属性不变
-d 可以复制软连接
--preserve:保留文件的特殊属性,如 SELinux 上下文等
-u:仅在源文件更新时才复制
-v:显示详细的复制信息,展示复制过程
cp file1.txt file2.txt
cp -a /home/user1 /home/user2
  • rm
1
2
3
4
5
6
7
8
rm remove
rm [选项] 文件或目录

-f force 强制删除
-r 递归删除
-i:在删除文件或目录前进行交互式确认,避免意外删除重要文件

rm -rf /home/user1
  • echo
1
2
3
4
5
6
echo 输出信息到屏幕
echo 996.icu
echo {a..z} >> /home/user1/test.txt

> 重定向符号 先清空再写入
>> 追加重定向 追加写入
  • cat
1
2
3
4
5
6
7
8
9
10
cat 显示文件内容
-n:显示行号,同时显示文件内容。
-b:显示行号,但仅对非空行编号,空行不编号。
-s:将多个连续的空行合并为一个空行输出。
-E:在每行末尾显示 $ 符号。
-T:将制表符显示为 ^I。
-A:同时显示 -E、-T 和 -v 的效果,以可见方式显示非打印字符。
-v:显示非打印字符。

cat -n /home/user1/test.txt
  • less
1
2
3
4
5
6
7
8
9
less # 查看文件内容
-N:显示每行的行号。
-S:在水平方向上截断长行,而不是换行显示。
-i:忽略搜索时的大小写。
-q:不显示"Press ENTER or type command to continue"的提示信息,直接退出。
-F:在只有一个屏幕可以显示所有内容时,不再显示“显示第 X 到 Y 行,共 Z 行”等提示信息,直接退出。
-h:显示帮助信息,列出 less 命令的选项说明。

less -N filename.txt
  • more
1
2
3
4
5
6
7
8
9
10
more 逐页显示文本文件内容
-d:显示每页内容前暂停,显示 --More-- 提示信息。
-l:忽略换行符,将长行视为单行显示。
-n:显示每行的行号。
-p:通过清除整个屏幕来显示文件,而不是在当前屏幕的底部显示文件。
-s:合并多个连续空白行为一行。
-u:禁用分页显示,直接将整个文件内容输出到屏幕上。
+N:从文件中的第 N 行开始显示。

more -n filename.txt
  • head
1
2
3
4
5
6
7
head 显示文件的开头部分
-n NUM 或 --lines=NUM:显示文件的开头 NUM 行内容。
-c NUM 或 --bytes=NUM:显示文件的开头 NUM 字节内容。
-q 或 --quiet 或 --silent:不显示文件名作为头部提示。
-v 或 --verbose:始终显示文件名作为头部提示。

head -c 20 filename.txt
  • tail
1
2
3
4
5
6
7
8
9
tail 显示文件末尾内容
-n NUM 或 --lines=NUM:显示文件的末尾 NUM 行内容。
-f 或 --follow:持续监视文件末尾的新增内容,实时显示文件的变化。
-c NUM 或 --bytes=NUM:显示文件末尾的 NUM 字节内容。
-q 或 --quiet 或 --silent:不显示文件名作为头部提示。
-v 或 --verbose:始终显示文件名作为头部提示。
-s SEC 或 --sleep-interval=SEC:指定 tail -f 命令输出之间的等待时间,默认为 1 秒。

tail -f filename.txt
  • find
1
2
3
4
5
6
7
8
9
10
find 文件搜索
find [search_dir] [options] [expression]


find /path/to/search -iname "filename" # -iname 忽略大小写
find /path/to/search -mtime +10
find /path/to/search -size +100M
find /path/to/search -type f # f代表文件,d代表目录
find /path/to/search -type f -name "*.txt" -o -name "*.md" //如果没有-o参数则必须同时
find /path/to/search -type f -mtime +30 -delete # 查找 /path/to/search 目录中所有的文件,并且修改时间大于30天进行删除
  • locate
1
2
3
4
5
6
# 在系统上快速定位文件 通过查询系统中维护的文件名数据库来实现高效的文件查找
locate [OPTION]... PATTERN...

updatedb # 更新 locate 的数据库
# locate在默认最小化安装的系统是不会自带的,需要额外安装,在mlocate包里面
# 安装该包以后,系统会自动创建一个定时任务,该任务每天执行一次,用于更新数据库
  • grep
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# globally search a regular expression and print
# egrep 是 grep 命令的一个变种,通常在许多 Unix系统上也可以用 grep -E 来代替。它与普通的 grep 命令有所不同,主要在于支持扩展的正则表达式语法。
grep pattern file

-i:忽略大小写
-r 或 --recursive:递归搜索子目录
-n:显示行号
-v:反向匹配
-E:支持扩展正则表达式
-o:仅显示匹配的文本
-l:仅显示包含匹配的文件名
-c: 统计行号

grep example file.txt #搜索文件中包含单词"example"的行
grep -r error . # 在当前目录及其子目录中搜索包含 "error" 的文件
grep -v warning file.txt # 搜索文件中不包含 "warning" 的行
grep '^[0-9]' file.txt # 使用正则表达式搜索包含 ^[0-9] 开头的行(以数字开头的行)
grep -rE 'pattern1|pattern2' directory # 递归搜索多个模式
grep -A5 examplie file.text # 匹配examplie及后5行,包括自己
grep -B5 examplie file.text # 匹配examplie及前5行,包括自己
grep -C5 examplie file.text # 匹配examplie上下5行,包括自己
  • tar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
tar cvf archive.tar file1 file2 file3 # 打包文件(不压缩)
# c:创建新的打包文件
# v:显示详细的过程(可选)
# f archive.tar:指定打包后的文件名

tar cvzf archive.tar.gz directory # 压缩为 .gz 格式
# z:使用 gzip 压缩
# f archive.tar.gz:指定压缩后的文件名

tar cvjf archive.tar.bz2 directory # 压缩为 .bz2 格式
# j:使用 bzip2 压缩

tar xvf archive.tar # 解压 .tar 文件
# x:提取文件。
# v:显示详细的过程(可选)。
# f archive.tar:指定要解压的文件名

tar xvzf archive.tar.gz # 解压 .tar.gz 文件
# z:使用 gzip 解压

tar xvjf archive.tar.bz2 # 解压 .tar.bz2 文件
# j:使用 bzip2 解压

# 使用 tar 命令时,选项的顺序很重要,通常 f 应该是最后一个选项,并且后面紧跟文件名
# 对于 gzip 和 bzip2,原始文件在压缩完成后会被删除,只留下压缩文件
# 使用 unzip 命令解压 .zip 文件时,会将文件解压到当前目录
  • 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
  • WGET

wget是一个非常强大的命令行下载工具,它可以用来下载文件、网页、目录等各种资源。它支持递归下载、断点续传、镜像网站等功能,非常适合自动化和批量下载任务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
wget [options] <URL>

-c: 断点续传
-r: 递归下载
-p: 下载页面所需的所有资源文件
-nH: 不创建主机名目录
-O <filename>: 指定输出文件名
-P <directory>: 指定输出目录

#只下载首页,但是不会下载附带的图片什么的
wget https://www.qq.com

#等效于Windowns的另存为xxx
wget -O example.zip https://example.com/example.zip

#下载这个目这个网站子目录里面的内容,一般用得比较少
wget -r https://www.example.com

#就是会下载代码里面css这些,也用的比较少
wget -p https://www.example.com

# Wget 的一些其他高级用法包括:
# 定时任务和计划任务: 利用 cron 等工具周期性地执行 Wget 命令
# 用户代理切换: 使用 -U 或 --user-agent 选项伪装成其他浏览器
# 认证和代理设置: 使用 -u/-p 或 --proxy-user/--proxy-password 选项
# 限速和并发: 使用 -l/--limit-rate 和 -p/--parallel 选项
# 部分文件有做防盗链配置,直接用wget命令无法直接下载,下载会提示403。但是使用浏览器点进去下载却是没问题的
  • CURL

curl是一个强大的命令行工具,用于在客户端和服务器之间传输数据。它支持广泛的协议,包括 HTTP、HTTPS、FTP、SFTP
等,并提供了丰富的功能和选项。wget最主要的功能是下载,但是时间在运维中,也只是用到了下载这个功能,虽然curl也可以达到同样的目的,只是curl最主要的功能调试http服务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
curl [options] <URL>

curl https://example.com
#如果首页是个html,则是把网页的html打印到控制台

curl -X POST https://example.com/api
#默认不加就是GET请求

curl -H "Content-Type: application/json" https://example.com/api
# 添加请求头:

curl -X POST -d "param1=value1&param2=value2" https://example.com/api
# 发送 POST 请求并传递数据

curl -o output.html https://example.com
#等效于把显示到控制台的内容,输出到文件

curl -L https://example.com
#等于打开跳转的地址


curl -O https://example.com/file.zip
#等效于wget 下载文件

curl -C - -O https://example.com/large_file.iso
# 断点续传

curl --proxy http://proxy.example.com:8080 https://example.com
# 设置代理


curl -I https://example.com
# 显示响应头 不显示网页,只显示http状态码
  • NETSTAT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
netstat [options] # 查看本地监听的情况

# 查看活动连接
-a: 显示所有连接和监听端口
-n: 以数字形式显示地址和端口
-t: 仅显示 TCP 协议的连接
-u: 仅显示 UDP 协议的连接
-x: 仅显示 UNIX 域套接字连接
# 查看监听端口
-l: 仅显示正在监听的连接
-i: 显示网络接口信息
# 查看进程信息
-p: 显示与每个连接相关的进程 ID 和进程名称
# 查看统计信息
-s: 显示各种协议的统计信息
# 查看路由表
-r: 显示内核路由表
# 输出格式控制
-e: 显示扩展信息
-A <family>: 仅显示指定地址族的连接
-o: 显示计时器信息
# 其他选项
-c: 持续刷新输出
-v: 显示版本信息

# 显示所有活动的 TCP 连接,包括远程地址、本地地址、状态和相关进程信息
netstat -antp

# 查看某个进程正在使用的网络连接

netstat -antp | grep 12345

# 在网络连接里面有一个概念叫五元组或者简化版的四元组(源 IP 地址,源端口号,目标 IP 地址,目标端口号,协议类型),一般除去协议类型就是四元组。
# 比如:我从linux服务器,请求一个地址123.150.76.218:80 ,那么在网络连接里面就就存在类似下面的一个连接,当然这里还有更多的信息,这里不展开

[root@localhost ~]# netstat -lnap
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.179.102:50276 123.150.76.218:80 TIME_WAIT -

源IP:192.168.179.102
源端口:50276
目标IP:123.150.76.218
目标端口:80
协议:TCP

# netstat 最常用的用法,就是使用本机查看网络连接情况 xxx可以是端口号,也可以进程号,也可以是进程名字
netstat -lnp |grep xxx

#如果某个进程无法访问网络,可以通过这样来检查网络连接,是否已经建立网络连接。
#具体细节涉及到TCP网络协议栈的问题,这里暂时不展开。
netstat -lanp |grep xxx
  • SS

ss命令是 netstat 命令的替代品,它提供了与 netstat 类似的功能,但性能更优,输出更详细。ss 命令的基本语法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
ss [options]
# 查看活动连接
-a: 显示所有连接和监听端口
-t: 仅显示 TCP 协议的连接
-u: 仅显示 UDP 协议的连接
-x: 仅显示 UNIX 域套接字连接
# 查看监听端口
-l: 仅显示正在监听的连接
# 查看进程信息
-p: 显示与每个连接相关的进程 ID 和进程名称
# 查看统计信息
-s: 显示各种协议的统计信息
# 查看套接字选项
-o: 显示套接字选项
# 输出格式控制
-n: 以数字形式显示地址和端口
-r: 以更易读的格式显示输出
# 其他选项
-i: 显示网络接口信息
-e: 显示扩展信息

# 查看系统上所有的 TCP 连接
ss -antp

ss -antp | grep 12345

与 netstat 相比,ss 命令的优势在于:

  • 更快的执行速度,特别是在连接数量非常大的情况下。

  • 输出更加详细和丰富,包括更多的连接信息和统计数据(信息也就更多,看起来也相对麻烦)。

  • 支持更多的过滤和查询选项,可以更精确地定位问题。大部分问题其实也不需要用到那么多选项。

  • SU

su 是在类 Unix 操作系统(如Linux、BSD等)中用于切换用户的命令。它的主要作用是让当前用户临时切换到另一个用户,可以是超级用户(root)或者系统中的其他用户。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
su [选项] [用户名]

# 选项:可以包括 - 或 -l,表示在切换用户时同时加载该用户的环境变量。如果啥都不加,则是不加载环境变量(这个后面会单独拿出来讲)
# 用户名:要切换到的目标用户,如果未指定用户名,则默认切换到超级用户(root)。

# 切换到 root 用户:最常见的用法是通过 su 命令切换到超级用户(root),以执行需要特权的操作,例如系统配置、软件安装等。在切换到 root 用户后,用户可以使用完整的系统管理权限进行操作。
# 切换到其他用户:除了切换到 root 用户外,su 命令还可以用于切换到系统中的其他用户。这对于测试和调试以及特定任务的执行很有用,例如测试用户环境、共享资源等。

su # 切换到 root 用户
su username # 切换到其他用户
su - username # 切换并加载用户环境变量 或者 su -l username

# 一种常见的安全策略是禁止root的ssh登录,然后使用普通用户ssh登录,然后开放su命令切换到root用户下进行对应的操作。在Linux进阶部分会有讲这部分内容。
# root的密码可以只开放给管理员,其他人使用普通账号使用登录系统。
  • sudo

sudo 是类 Unix 系统(如Linux、BSD等)中的一个命令,用于允许授权用户以另一个用户的身份执行命令。它的名称来源于”Superuser Do”
(超级用户执行),用于执行需要超级用户权限(通常是 root 用户权限)的任务,而无需直接切换到 root 用户。

  • 权限管理:
    • 临时提升权限:允许普通用户在需要时以特权用户(通常是 root)的身份执行命令,执行完毕后权限自动降低为普通用户。
    • 授权控制:管理员可以通过配置 sudoers 文件详细控制哪些用户可以以哪些用户的身份执行哪些命令,以及在哪些主机上执行。
  • 安全性:
    • 审计:sudo 的使用可以被记录和审计,管理员可以了解哪些用户在何时执行了哪些特权操作,有助于系统安全和问题追踪。
    • 限制权限:相比直接使用 root 用户,sudo 允许更细粒度地控制用户对系统的访问权限,减少了误操作和滥用特权的风险。
1
2
3
4
5
6
7
8
9
sudo command

sudo -u username command # 以其他用户身份执行

# 编辑文件
sudoedit file
sudo vi file //也可以这样

sudo yum updae # root角色执行命令
  • 密码验证:默认情况下,sudo 会要求用户输入自己的密码来验证身份。
  • 安全配置:应当小心配置 sudoers 文件,确保只有可信用户可以执行特权操作,并限制执行的具体命令和参数。
  • 不建议直接使用 root 用户:推荐使用 sudo 来执行需要特权的任务,以避免潜在的安全风险和操作失误。
1
2
3
4
5
6
7
8
9
10
11
12
13
# 允许特定用户执行sudo命令

# Allow root to run any commands anywhere
root ALL=(ALL) ALL
#需要添加这行,user01才有使用sudo命令的权限
user01 ALL=(ALL) ALL

# 免密使用sudo

## Allow root to run any commands anywhere
root ALL=(ALL) ALL
#修改成这样,就可以免密使用sudo命令
user01 ALL=(ALL) NOPASSWD:ALL
  • UMASK

umask 是一个 Unix/Linux 的 shell 命令,用来设置文件创建时的默认权限。这是一个设置了用户文件和目录创建模式的掩码值。

在 Unix/Linux 系统中,当创建新的文件或目录时,系统会根据 umask 值来设置新文件或目录的默认权限。这个 umask 值通常是一个 4
位的八进制数,如 0022、0007 等

1
2
3
4
5
6
7
8
9
10
umask 命令的使用格式为:umask [选项]... [模式]。
- 如果不带任何参数,umask命令会显示当前的 umask 值。
- 如果带有模式参数,umask 命令会设置 umask 值为指定的模式。
一些常见的 umask 值:
- umask 0022:文件的默认权限是 644(rw-r--r--),目录的默认权限是 755(rwxr-xr-x)。
- umask 0007:文件的默认权限是 660(rw-rw----),目录的默认权限是 770(rwxrwx---)。
- umask 0077:文件的默认权限是 600(rw-------),目录的默认权限是 700(rwx------)。

需要注意的是,umask 是一个掩码值,它的作用是屏蔽掉(即禁用)某些权限,而不是直接设置权限。所以,要得到文件或目录的实际默认权限,需要用基础权限(通常是 777 对于目录,666 对于文件)减去 umask 值。
正常Centos系统的umask是0022,一般读法是022,第一个0会被省略,一般也不需要去修改。该参数默认在/etc/profile,这个也是环境变量最常用的配置文件之一(后期会单独出环境变量的介绍)
  • chmod

chmod 命令是用于在Unix和类Unix操作系统(如Linux)上改变文件或目录的权限的命令。它是 “change mode”
的缩写,允许用户设定文件或目录的读、写、执行权限,以及特殊权限(如 SUID、SGID、Sticky bit)等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
chmod options permissions filename

options:可选,用于指定特定的操作或设置。
permissions:设定的权限模式,可以使用数字形式(如 755)或符号形式(如 u=rwx,g=rx,o=rx)。
filename:需要改变权限的文件或目录名。

-R:递归的应用权限设置到指定目录下的所有文件和子目录。
-v:显示详细信息,指示 chmod 所做的每个修改。
-c:只显示实际改变了权限的文件。

数字形式权限:
数字形式权限由三个八进制数字构成,每个数字代表一组权限(所有者、所属组、其他用户)。每个数字可以是以下几种权限的组合:
4:读权限(r)
2:写权限(w)
1:执行权限(x)

计算方式为将所需权限的数字相加。例如:
7:读(4)+ 写(2)+ 执行(1)
6:读(4)+ 写(2)
5:读(4)+ 执行(1)
4:只读(4)
0:无权限

符号形式权限:
符号形式允许更精细地控制权限,主要由以下几个部分组成:
u:表示文件所有者(user)
g:表示文件所属组(group)
o:表示其他用户(others)
a:表示所有用户(user、group、others)

权限部分可以使用以下符号:
+:增加权限
-:移除权限
=:设定权限

chmod 744 example.txt # 给文件 example.txt 设置所有者具有读写执行权限,所属组和其他用户具有只读权限
chmod u+w example.txt # 为文件 example.txt 添加用户写权限
chmod -R u+w dir # 为 dir 添加用户写权限,并且递归应用到子目录
chmod u+s script.sh # 为 script.sh 文件设置 SUID 权限
chmod g+s data.txt # 为 data.txt 文件设置 SGID 权限
  • chown

chown 命令用于更改文件或目录的所有者(owner)。它允许系统管理员或文件所有者将文件或目录的所有权转移给其他用户或组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
chown [options] new_owner[:new_group] filename

options:可选,用于指定特定的操作或设置。
new_owner:新的所有者用户名或用户ID。
new_group:新的所属组名或组ID,可选。如果未指定,则文件的所属组不变。
filename:需要改变所有者的文件或目录名。

-v:显示详细信息,显示实际更改了的每个文件。
-c:只显示实际更改了的文件数量,而不显示详细信息。
--reference=RFILE:从参考文件 RFILE 复制所有者和所属组的信息到目标文件或目录。

chown user1 file.txt # 更改文件所有者
chown user2:group2 file.txt # 同时更改文件所有者和所属组
chown -R user3:group3 directory/ # 递归地更改目录及其所有子目录和文件的所有者

chown主要用来修改文件所有者,同时修改组,但是还有一个chgrp命令可以单独修改组权限
  • history

  • 显示命令历史:直接在 Bash 终端中输入 history 命令即可显示当前会话中执行过的命令列表,每行一个命令,序号从小到大排列。

  • 使用序号重新执行命令:可以使用 ! 加上命令的序号来重新执行特定的命令。

  • 搜索历史记录:可以使用 Ctrl+R 键来搜索历史记录中的命令。按下 Ctrl+R 后,输入关键字(如 vi),Bash 将会显示最近使用过的包含该关键字的命令,按下
    Enter 可以执行搜索到的命令。

  • 清空整个历史记录:可以使用 history -c 命令清空当前 shell 会话的所有历史记录。

  • 保存历史记录到文件:使用 history -w 命令将当前的命令历史记录保存到默认的历史文件(通常是 ~/.bash_history)中,这样即使关闭
    shell 会话,历史记录也能被保留

总结

  1. 我们通常通过该命令分析曾经执行过的命令,来确定服务器的某些状态是谁执行的,比如谁在什么时候删除了文件,修改了时间等操作。
  2. 非正常退出是不会保存到历史记录的,必须是正常退出才会自动保存当前shell执行的命令。
  3. 不同的用户的histroy是独立的 ,因为这个文件是被记录在家目录.bash_history 文件。
  4. 快速生成1000条的历史命令。 for ((i=1; i<=1000; i++)); do echo “echo Command $i”; history -s “echo Command $i”; done
  5. 最常用的配置是修改历史命令数量,和添加时间戳及用户功能。
    HISTSIZE=10000
    export HISTTIMEFORMAT=”%F %T $(whoami)”
  6. ctrl+r 搜索以后,如果这个命令被执行过多次,可以继续用ctrl+r 继续向前搜索。
  • echo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
echo [OPTION] [STRING]

-n 不会自动换行,输出后不添加换行符。
-e 识别转义字符,如 \n 表示换行符。

# 输出一条简单的消息
echo "Hello, World!"

# 输出变量的值
name="Alice"
echo "Hello, $name"

# 不换行输出
echo -n "This is a "
echo "single line."

# 识别转义字符
echo -e "First line\nSecond line"

# 输出特殊字符
echo "The cost is \\$10" # 输出:The cost is \$10

应用场景

  • 在脚本中用于输出调试信息或提示消息。

  • 用于打印变量值,方便调试和查看内容。

  • 结合重定向符号(> 和 >>)将输出内容写入文件,后面将单独将重定向。

  • date

在Linux基础软件-ntp里面我们讲过在没有ntp或者chrony的时候可以通过date来设置时间。

date 命令在Linux和Unix系统中用于显示或设置系统的日期和时间。它可以输出当前的日期时间,或者根据指定的格式来格式化日期时间的输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
date [OPTION]... [+FORMAT]

-d, --date=STRING:显示给定日期时间的格式。
-u, --utc, --universal:显示UTC时间(协调世界时)。
-s, --set=STRING :设置时间或者日期。
+%FORMAT:用指定格式输出日期时间。

# 格式化字符串
# 在 +FORMAT 中,可以使用以下特殊的格式化字符串来定义输出的日期时间格式:
%Y:四位数的年份(如:2024)。
%m:两位数的月份(01 到 12)。
%d:两位数的日(01 到 31)。
%H:24小时制的小时数(00 到 23)。
%M:两位数的分钟数(00 到 59)。
%S:秒数(00 到 60)。
%Z:时区(例如:UTC、GMT、PST)。

应用场景

  • 在脚本中记录日志,使用 date 命令添加时间戳。

  • 用于文件名的时间戳,例如备份文件。

  • 调试和分析日志文件时,确定特定事件发生的时间。

  • 在需要精确计时和定期任务的自动化脚本中使用。

  • alias

我们曾经说过有一个命令ll,实际上是ls -l。他们的实现方式实际就是alias。当然还有很多命令默认都是有alias的。

alias 命令用于在命令行中创建命令别名,允许用户为常用命令或命令序列定义简短的替代名称。这样做可以显著提高命令行操作的效率和便捷性。

1
2
3
4
5
6
7
8
9
alias [name[=value] ...]

alias ll='ls -l'

alias grep='grep --color=auto'

alias # 查看当前定义的所有别名

unalias ll # 删除别名

永久生效

  • 在终端中定义的别名仅在当前会话中有效,关闭终端后会丢失。如果希望别名永久生效,可以将其添加到用户的 shell 配置文件中,比如:
  • 对于 bash shell,可以将别名定义添加到 ~/.bashrc 文件中。
  • 然后使用 source ~/.bashrc 命令使其立即生效,或者重新启动终端。

应用场景

  • 简化命令行操作: 将常用的复杂命令或长命令序列定义为简单易记的别名,减少输入量。
  • 增强命令功能: 向命令添加默认参数或选项,以便于特定需求的快速调用。
  • 提高工作效率: 根据个人工作流程和使用习惯优化命令行环境,使得操作更高效。

linux文件系统相关

linux目录及含义

相对路径 绝对路径的含义:略

目录结构大部分情况下是相似的,具体可能会根据不同的发行版有所不同。

Linux与Windows目录区别:Linux目录:一切从根开始,形似一个倒挂的大树。Windows下面目录:从C盘或D盘开始

  • / 根目录
  • /root root用户的家目录
  • /bin 二进制目录,存放系统的基本命令,如ls、cd、rm等
  • /boot 启动目录,有点类似win的启动光盘
  • /etc 系统服务配置文件的目录,存放系统,服务的配置
  • /lib /lib64 库文件目录,存放系统动态链接库和内核模块
  • /mnt 挂载目录,用于挂载其他文件系统
  • /opt 可选的应用软件包目录,一些附加的应用程序会放在这里
  • /proc 虚拟文件系统目录,用于系统核心,例如进程和系统信息
  • /sbin 系统二进制文件目录,存放需要超级用户权限才能运行的二进制文件
  • /tmp 临时目录,通常重启以后,里面的内容都会删除
  • /usr 用户资源目录,通常重启是应用程序所在目录
  • /var 可变目录,比如常用的日志,默认软件的数据目录
  • /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
3
4
5
6
7
8
#这是一个本地虚拟机的磁盘,只有一个盘/dev/sda,大小是20G.其中/boot目录500M,根目录"/"使用了剩余的19.5G.
#当然最下面的还有个设备/dev/sro 其实就是光盘,本地是iso文件,但是如果我要使用,还必须把他挂载到一个目录才可以使用.
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 19.5G 0 part /
sr0 11:0 1 942M 0 rom

介绍2个命令,一个是上面已经用到lsblk,我们用他查看有多少个磁盘,以及分区情况。如果磁盘故障或者其他原因未识别到,这里也不会显示。在实际运维中也可用于判断磁盘是否异常。另外一个命令是fdisk,他就会显示完整的路径,日常使用看个人习惯即可。

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# fdisk -l
磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000bb97e

设备 Boot Start End Blocks Id System
/dev/sda1 * 2048 1026047 512000 83 Linux
/dev/sda2 1026048 41943039 20458496 83 Linux

在比较早的时候,磁盘有一种接口叫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
2
3
4
5
6
7
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 19.5G 0 part /
sdb 8:16 0 20G 0 disk
sr0 11:0 1 942M 0 rom

1.开始分区

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0x898f0efa 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):

2.进入选择菜单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#输入m以后进入选择菜单,大家可以直接根据英文翻译就能看出来是什么意思

命令(输入 m 获取帮助):m
命令操作
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)

3.创建新分区

1
2
3
4
5
6
7
#输出n以后,将进入分区界面

命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):

这里涉及到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
2
3
4
5
6
7
8
9
10
#如果只分一个分区,这里可以一路回车,或者根据提示输出对应的数字

Select (default p): p
分区号 (1-4,默认 1):1
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):
将使用默认值 41943039
分区 1 已设置为 Linux 类型,大小设为 20 GiB
命令(输入 m 获取帮助):

5.保存分区表

1
2
3
4
5
6
7
8
9
#到这里个界面的时候,如果敲太快回车,就会退出,需要注意
#如果你还记得前面的提示,可以直接按"w"保存分区表
#如果你不记得前面的提示,就再次按"m",然后根据提示选择

命令(输入 m 获取帮助):W
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。

6.分区完成

到这里我们分区做完了,但是这个时候我们还不能使用这个磁盘,可以看到同sda对比,他还没挂载到对应的目录。

1
2
3
4
5
6
7
8
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 19.5G 0 part /
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 20G 0 part
sr0 11:0 1 942M 0 rom

GPT分区

1.准备1个3T硬盘

1
2
3
4
5
6
7
8
9
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 19.5G 0 part /
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 20G 0 part
sdc 8:32 0 3T 0 disk
sr0 11:0 1 942M 0 rom

2.开始分区

1
2
3
4
5
[root@localhost ~]# parted /dev/sdc
GNU Parted 3.1
使用 /dev/sdc
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)

3.打印磁盘信息

1
2
3
4
5
6
7
8
9
10
(parted) print                                                            
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 3221GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start End Size Type File system 标志

(parted)

4.创建GPT分区表

1
2
3
4
5
6
7
8
9
10
11
12
13
(parted) mklabel gpt                                                      
警告: The existing disk label on /dev/sdc will be destroyed and all data on this disk will be lost. Do you want to continue?
是/Yes/否/No? yes
(parted) print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 3221GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name 标志

(parted)

5.创建分区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#创建分区使用全部磁盘内容,也可以根据实际情况选择。

(parted) mkpart primary 0% 100%
(parted) print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 3221GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name 标志
1 1049kB 3221GB 3221GB primary

(parted) quit
信息: You may need to update /etc/fstab.

6.分区完成

到这里我们分区做完,但是这个时候我们还不能使用这个磁盘,目前使用MBR和GPT的分区都是只属于分区完成,未使用的状态。

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 19.5G 0 part /
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 20G 0 part
sdc 8:32 0 3T 0 disk
└─sdc1 8:33 0 3T 0 part
sr0 11:0 1 942M 0 rom

挂载

开始之前,我们如何知道我们的分区是MBR,还是GPT呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#安装的时候选择中文,才可以用中文过滤,dos就是MBR,gpt就会GPT.
[root@localhost ~]# fdisk -l |grep "磁盘标签"
磁盘标签类型:dos
磁盘标签类型:gpt


[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 19.5G 0 part /
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 20G 0 part
sdc 8:32 0 3T 0 disk
└─sdc1 8:33 0 3T 0 part
sr0 11:0 1 942M 0 rom

在Windows里面我们格式化的时候,有2种文件系统:NTFS和FAT32。而在Linux系统里面目前用得最多的系统是ext4和xfs,这里我们有2块盘分别用不同的方式进行格式化。在ext4前面当然还有ext3,ext2。当然在其他类型的Linux里面也还有更多的文件系统。

1.格式化ext4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@localhost ~]# mkfs.ext4 /dev/sdc1
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
196608000 inodes, 786431488 blocks
39321574 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=2933915648
24000 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848, 512000000, 550731776, 644972544

Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成

2.格式化xfs

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=1310656 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=5242624, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0

3.挂载磁盘

前面说过,磁盘可以挂载到任何目录,但是系统自带的目录一般都是安装系统的时候就已经完成配置,一般都不要去动他。这里我们就创建2个新目录进行挂载。有挂载也就有卸载,卸载使用的命令是umount。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost ~]# mkdir /data /data1
[root@localhost ~]# mount /dev/sdb1 /data
[root@localhost ~]# mount /dev/sdc1 /data1
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 19.5G 0 part /
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 20G 0 part /data
sdc 8:32 0 3T 0 disk
└─sdc1 8:33 0 3T 0 part /data1
sr0 11:0 1 942M 0 rom

###[root@localhost ~]# umount /data1
###卸载最容易遇到的问题就是磁盘正在被使用,无法卸载。
###这里可能会会涉及到2个命令lsof和fuser,有兴趣可以去了解下。

4.配置fstab

如果挂载以后直接使用也没有问题,但是如果主动或者被动重启了系统,你会发现磁盘会被还原到未挂载的情况,那怎么实现开机自动挂载呢?这里就需要知道在Linux里面有下面这个一个文件,你的磁盘是否自动挂载都写到这里。

在刚刚挂载的时候,我们用的是直接用的是输入的设备地址,而下面配置文件写的是一串UUID,他们之间有什么区别呢?我如何知道每个盘的UUID呢?这里需要知道一个命令blkid,他会告诉你每个盘的UUID。

他们之间有什么区别呢?每个盘的UUID是不会变的,所以用UUID是可靠的,但是如果用设备名字,这个是可能出现问题的,比如原来有3个盘,其中一个盘坏了,他们的盘符是可能会发生变化的,如果因为磁盘故障,外加重启就可能导致盘符出现变化,这个时候可能会出现我们意想不到的问题。

确认好怎么配置以后,参考上面的格式进行配置即可,配置完成以后最好重启一下,如果配置错误可以在还未开始应用的时候修复,避免正式使用以后遇到重启在引发的问题。

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# cat /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Fri Jun 7 19:56:34 2024
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=fb21e404-5ed7-400f-b936-ce2d8b631bfe / xfs defaults 0 0
UUID=15251c96-cf20-46c3-ac06-c5b86c4afe70 /boot xfs defaults ms, by reference, are maintained under '/dev/disk'
1
2
3
4
5
6
[root@localhost ~]# blkid
/dev/sda1: UUID="15251c96-cf20-46c3-ac06-c5b86c4afe70" TYPE="xfs"
/dev/sda2: UUID="fb21e404-5ed7-400f-b936-ce2d8b631bfe" TYPE="xfs"
/dev/sdb1: UUID="9fcb9c55-b38c-472e-b8b7-07db7b243e4f" TYPE="xfs"
/dev/sdc1: UUID="53e67bf0-fe14-4cd0-bcd9-8b9720e2360b" TYPE="ext4" PARTLABEL="primary" PARTUUID="cea97c50-59e7-4f79-9454-5b86fd67b7a0"
/dev/sr0: UUID="2019-09-11-19-02-53-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTY
1
2
3
4
#可以,但是不推荐的方式
/dev/sdb1 /data xfs defaults 0 0
#推荐的挂载方式
UUID=53e67bf0-fe14-4cd0-bcd9-8b9720e2360b /data1 ext4 defaults 0 0

inode&硬连接

“Inode” 是文件系统中一个重要的概念,特别是在类 Unix 操作系统中(如 Linux)。它是 “index node”
的缩写,用于存储文件或目录的元数据信息。每个文件和目录在文件系统中都有一个唯一的
inode,它包含了关于文件的重要信息,如文件的权限、所有者、大小、时间戳以及数据块的位置等。

Inode 的主要组成部分包括:

  • 文件类型和权限: 文件类型(regular file、directory、symbolic link 等)和访问权限(读、写、执行)。
  • 所有者和所属组:文件或目录的所有者和所属的用户组。
  • 文件大小:文件占用的大小(以字节为单位)。
  • 时间戳:包括文件的访问时间、修改时间和状态改变时间。
  • 指向数据块的指针:存储文件数据的实际位置,这些指针可以直接指向数据块,或者在某些情况下,指向间接块、双重间接块和三重间接块。

Inode 的作用:

  • 唯一标识:每个文件和目录在文件系统中由唯一的 inode 号码标识。
  • 元数据管理:存储文件和目录的元数据信息,例如权限、所有者、大小等。
  • 性能优化:通过 inode 可以快速访问和管理文件的元数据,从而提高文件系统的性能。
  • 硬链接:硬链接是通过相同的 inode 号码连接到同一文件的多个文件名。这允许文件在文件系统中具有多个名称,但是只有一个物理副本,因为所有硬链接共享相同的
    inode。

在 Linux 中,可以使用命令如 ls -i 来查看文件或目录的 inode 号码,或使用 stat 命令查看详细的 inode 元数据信息。

总结

  1. inode简单理解就是从整个分区里面分割出来一部分空间,用来存储inode信息,大小是根据分区大小自定定义的。
  2. 如果没特需求不建议修改inode的大小调整。
  3. inode 也是有容量限制的,如果磁盘里面是大量的小文件,inode就可能满的,这个时候也是无法写入文件的,也是普通运维最容易遇到的inode问题。
  4. 结合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取消连接。

df 命令

df 命令(磁盘空间使用情况查询)是一个常用于查看文件系统磁盘空间使用情况的命令。它能够显示指定文件系统的总空间、已使用空间、可用空间以及使用率等信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
df [选项] [文件或目录]

-h:以人类可读的方式显示输出结果,使用 K(千字节)、M(兆字节)、G(吉字节)等单位。
-T:显示文件系统类型。
-i:显示 inode 的使用情况而不是磁盘块的使用情况。
-t <文件系统类型>:仅显示指定文件系统类型的信息。
-x <文件系统类型>:排除指定文件系统类型的信息。


df -h # 显示所有文件系统的磁盘空间使用情况(以人类可读的格式)
df -t ext4 # 仅显示特定类型的文件系统(比如 ext4 文件系统)
df -h /home/user # 显示指定目录的文件系统磁盘空间使用情况

# df 命令显示的信息依赖于文件系统的挂载状态和权限,通常需要以管理员或超级用户权限运行以获得完整的信息。
# 使用 -h 选项可以更方便地查看磁盘空间使用情况,以人类可读的格式显示。
# df 命令用于快速查看文件系统的整体状况,特别是在管理存储空间、排查空间不足问题时非常有用。

du 命令

du 命令用于查看目录或文件的磁盘使用情况,即显示指定路径下文件和目录的磁盘使用量。它可以帮助你快速了解文件或目录占用的存储空间大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
du [选项] [文件或目录]

-h:以人类可读的方式显示输出结果,使用 K(千字节)、M(兆字节)、G(吉字节)等单位。
-s:仅显示总计信息,而不显示每个文件或目录的详细大小。
-c:同时显示所有列出的目录或文件的总计大小。
-a:显示所有文件和目录的大小,而不仅仅是目录。
-k:以 KB 单位显示磁盘使用量,这是默认的单位。

du -h # 显示当前目录及其子目录的磁盘使用情况(以人类可读的格式
du -sh /home/user/docs 显示特定目录或文件的磁盘使用情况(以人类可读的格式
du -sh * # 示目录的总计大小,包括所有子目录和文件
du -ah | sort -rh # 显示目录或文件的详细大小并按大小排序

# du 命令计算磁盘使用量时,默认只统计文件的物理大小,而不包括间接块、块大小或磁盘分配的大小。
# 使用 -h 选项可以更方便地查看磁盘使用情况,以人类可读的格式显示。
# du 命令通常用于快速评估目录或文件占用的存储空间,特别是在管理磁盘空间、查找大文件或清理存储空间时非常有用。

df 是从文件系统来统计的,du是从文件来统计的,正常的情况下这这种统计数据是很接近的,有两种意外情况

  • df 使用量远大于du统计数据量,这个问题是文件句柄未释放,重启系统可以解决
  • du统计数量已经超过df看到的磁盘总量,比如磁盘20G,du统计出来有25G,这个时候可以添加-x参数就可以规避掉这个问题(
    主要出现在有Docker的环境
  • df -h 如果卡住不输出,那么这个系统肯定是有问题的(常出现在nfs客户端,这个时候nfs服务端挂掉,nfs客户端执行这个命令就会卡住)

Linux 网络相关

本文档会涉及到一些网络配置相关信息,如果要配置网络,需要先知道网卡的配置文件(在Linux里面一切皆文件,这也是Linux的思想之一)也会涉及到一些基础操作命令。

1.找到网卡配置文件

1
2
3
4
cd /etc/sysconfig/network-scripts
#一般而言centos7的网卡名字都叫ifcfg-ensxxx
#对于有早期的it经验的人而言一般网卡名字都是ifcfg-eth0或者ifcfg-eth1
#名字是可以随便修改的,这个是看个人习惯,目前主流的云厂商一般而言网卡的名字都是ethx,主要方便记忆和习惯。

2.默认网卡配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#此配置也是默认生成的配置文件
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=607b48a5-3828-419b-ba97-8672bec9225f
DEVICE=ens33
ONBOOT=no

3.手工配置网卡文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 部分参数可以进行删减,,下面的配置基于默认配置文件进行了修改。
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="4385a0df-063d-42f7-a9f4-827ac1242248"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.40.211"
PREFIX="24"
GATEWAY="192.168.40.1"
DNS1="61.139.2.69"
DNS2="223.5.5.5"
IPV6_PRIVACY="no"


# 其实这样也是可以的
DEVICE=ens33
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR=192.168.0.2
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
DNS1=8.8.8.8

4.重启网卡&服务

1
2
3
4
5
6
#启动单网卡
ifup ifcfg-ens33
#启动网络服务,生产环境这个命令要慎重,因为它可能让你失去网络
systemctl restart network
#查看ip是否配置正常
ip a # 也可以使用ifconfig,默认最小化安装没这个命令

5.配置文件解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
下面是一些常见的Linux网卡配置文件参数的解释:
DEVICE:网络设备的名称,如eth0、eth1等。
TYPE:网络设备的类型,一般为Ethernet。
ONBOOT:开机是否启动网络接口,一般设置为yes。
BOOTPROTO:接口获取IP的方式,一般有dhcp(动态获取),static(静态IP),none(无)等几种。
IPADDR:IP地址,如果BOOTPROTO为static,那么需要手动设定一个IP地址。
NETMASK:子网掩码,如果BOOTPROTO为static,那么需要手动设定一个子网掩码。
GATEWAY:默认网关,如果BOOTPROTO为static,那么需要手动设定一个默认网关。
HWADDR:MAC地址,一般不需要手动设置,系统会自动读取网卡的MAC地址。
IPV6INIT:是否启动IPv6协议,一般设置为yes或者no。
USERCTL:是否允许普通用户控制此设备,一般设置为yes或者no。
DNS1、DNS2:DNS服务器地址,可以设定一个或者两个,用于域名解析。
NM_CONTROLLED:是否由NetworkManager管理,设置为yes表示由NetworkManager管理,设置为no表示由network service管理。

这些参数都是可选的,不是每一个配置文件都需要所有的参数。具体使用哪些参数取决于你的网络配置需求。

6.总结

  1. 这个是比较常用的配置ip的方式,永久生效。
  2. 也可以通过命令直接配置,但是这个重启以后会丢失。
  3. ip不仅可以配置单个,也可以配置多个。
  4. 设备名字都会省略”ifcfg-“,但是在Linux目录里面必须包含。

PING

ping命令是网络诊断工具中最基础和常用的命令之一。它用于检查两台主机之间的网络连通性,并测量数据包的往返时间 (Round-Trip
Time, RTT)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ping <目标主机IP或域名>

-c <数量>: 指定发送数据包的数量,默认是无限发送(Windowns是发送4个)。
-i <秒数>: 设置发送数据包的时间间隔,默认是 1 秒。
-W <秒数>: 设置等待响应的超时时间,默认是 10 秒。
-s <字节数>: 指定发送数据包的大小,默认是 56 字节。

ping 命令的输出信息包括:
丢包率: 发送的数据包中有多少没有收到响应。
最小/平均/最大 RTT: 数据包的最小、平均和最大往返时间。
标准差: RTT 的标准差,反映了网络时延的稳定性。


[root@localhost ~]# ping 192.168.179.105
PING 192.168.179.105 (192.168.179.105) 56(84) bytes of data.
64 bytes from 192.168.179.105: icmp_seq=1 ttl=64 time=0.576 ms
64 bytes from 192.168.179.105: icmp_seq=2 ttl=64 time=0.274 ms
64 bytes from 192.168.179.105: icmp_seq=3 ttl=64 time=0.183 ms
64 bytes from 192.168.179.105: icmp_seq=4 ttl=64 time=0.331 ms
64 bytes from 192.168.179.105: icmp_seq=5 ttl=64 time=0.696 ms

总结

  1. icmp_seq=x 是发送请求编号,如果中途缺少一个,则说明包丢了。
  2. TTL 是 IP 数据包头部的一个字段,用于控制数据包在网络中的存活时间。简单点说TTL默认64,离64越远,则经过的设备越多。
  3. time 是超时时间,一般本机都是是小于1ms,一般局域网不会超过10ms,全国同网一般不会超过50ms。
  4. 判断ping就是判断是否丢包,延时是否不稳定。
  5. 一般情况下,能ping通,就代表网络的联通性是没问题的,但是也可能出现对方服务器限制了ping的原因。
  6. ping通和端口通是完全没有任何关系的两件事。

TELNET

Telnet是一种基于 TCP/IP 的远程登录协议,它允许用户从本地计算机远程访问和控制其他计算机。

1
2
3
4
5
6
7
8
9
10
telnet <目标主机IP地址或域名> <端口号> # 默认是 23 端口


#如果失败则是无反应,或者提示连接被拒绝
#该情况说明对方的22端口是通的
[root@localhost ~]# telnet 192.168.179.105 22
Trying 192.168.179.105...
Connected to 192.168.179.105.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.4

总结

  1. telnet只支持TCP协议,不支持UDP协议。
  2. telnet不仅用于探测端口是否畅通,还可以用于登录网络设备(交换机等)。
  3. telnet不仅用于探测端口是否畅通,还可以用于登录某些特殊服务(不常见)。
  4. 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操作系统的用户体系非常灵活,这使得它成为了一个很好的多用户系统。它有三种类型的用户:超级用户(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)以及所属的组。
  • su username:切换到其他用户。例如 su - username 将会切换到用户,并加载用户的环境变量。
  • whoami:显示当前的用户名。
  • who:显示当前登录的所有用户。
  • last:显示系统的登录记录。

用户管理

1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
#省略中间部分
nginx:x:997:995:Nginx web server:/var/lib/nginx:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
#省略中间部分
user01:x:1000:1000::/home/user01:/bin/bash

root 属于超级管理员,无论用户ID还是组ID都是0
nginx&ntp 属于系统用户,都是服务自带的用户,/sbin/nologin 就是不允许登录,包括ssh和通过控制台
user01 属于常规用户,属于通过useradd 增加的用户的,没有nologin就是允许ssh和通过

/etc/passwd 文件中的每一行都代表系统上的一个用户账号,每行由多个字段组成,字段之间使用冒号(:)分隔。典型的字段包括:

  • 用户名:用户的登录名。
  • 密码占位符:(在现代系统中通常是 x)原本是存储加密的密码,现在通常是存储在 /etc/shadow 文件中,或者指向其他安全存储的文件。
  • 用户 ID (UID):唯一标识符,用于系统内部识别用户。
  • 组 ID (GID):该用户所属的主要组的标识符。
  • 用户描述:一般是用户的全名或注释。
  • 主目录:用户登录后所处的初始目录。
  • 登录 Shell:用户登录后默认使用的 Shell 程序。
1
2
3
4
5
[root@localhost ~]# cat /etc/shadow
root:*:18961:0:99999:7:::
#省略中间部分
ntp:!!:19885::::::
user01:!!:19893:0:99999:7:::

/etc/shadow 文件用于存储用户账号的加密密码、密码过期信息以及账号是否被锁定等敏感信息。相比于 /etc/passwd
文件,它具有更高的安全性,因为普通用户无法直接读取此文件。

文件结构:

  • 用户名:与 /etc/passwd 中的用户名对应。
  • 加密密码:使用密码哈希算法加密后的密码。实际密码不会直接存储在此处,只存储其哈希值。
  • 密码最后更改日期:自 Unix 时间戳起,距离上次更改密码的天数。
  • 密码更改最短天数:两次密码更改之间的最小天数间隔。
  • 密码更改最大天数:密码的有效期,超过此期限用户需要强制更改密码。
  • 密码过期前警告天数:密码即将过期前,提前多少天发出警告。
  • 账号失效日期:账号失效的日期,即停止使用该账号的日期。
  • 账号标志:包含有关账号当前状态的其他信息,例如是否被锁定等。
  • 每一行对应一个用户账号,字段之间用冒号(:)分隔。
  • 访问权限:/etc/shadow 文件具有非常严格的访问控制,通常只有 root 用户或具有相应特权的用户能够读取和修改此文件。这是为了确保用户密码和账户信息不被未经授权的用户获取。
  1. 如果自己是一个普通运维角色,我们能拿到的账号和密码,应该是一个普通用户和密码。
  2. 如果自己是运维管理员的情况,则分配给其他人的账号也只能是一个普通账号。
  3. 普通用户可以可以通过su及sudo命令来提升自己的权限,用于完成需要超级管理员权限才能完成运维的操作。
  4. 当然,这并不是标准方案,你可以根据自己的实际情况选择。
  5. 有的应用程序则要求必须使用非root用户启动,比如es,使用root则会被提示不允许使用root启动。

用户组介绍
在类 Unix 操作系统(如Linux、FreeBSD等)中,用户组是用于管理和组织用户的一种机制。以下是关于用户组的基本介绍:

  • 定义:
    • 用户组是一组用户的集合,它们可以共享相同的权限和访问控制设置。每个用户都可以属于一个或多个用户组。
  • 用途:
    • 权限管理:用户组是控制文件和系统资源访问权限的重要机制。通过用户组,系统管理员可以轻松管理多个用户对文件和目录的访问权限。
    • 共享资源:用户组允许一组用户共享相同的资源,这在团队和组织环境中特别有用。
    • 管理简化:通过组织用户到不同的组中,系统管理员可以更有效地分配和管理用户权限,而不必为每个用户单独设置权限。
  • 特性:
    • 主组:每个用户在创建时会有一个主组,通常与其用户名相同。这个主组是用户在文件系统上创建文件和目录时的默认所属组。
    • 附加组:用户可以同时属于多个附加组,这些组可以授予用户访问其他资源的额外权限。
  • 管理工具:
    • groupadd:用于创建新的用户组。
    • groupdel:用于删除现有的用户组。
    • groupmod:用于修改用户组的属性,如名称或GID(组ID)。
    • gpasswd:管理用户组的密码(组密码)。
    • groups:显示当前用户所属的所有组。
  • 其实还有2个涉及权限的命令也可以操作文件和目录的组权限。
  • 在Unix/Linux系统中,管理用户组的主要工具包括:
  • 文件:
    • 用户组信息通常存储在 /etc/group 文件中。这个文件包含了所有用户组的列表,每个用户组一行,由冒号(:)分隔的字段构成,包括组名、组密码(通常是
      x)、组ID(GID)和组成员等信息。
  • 权限:
    • 文件和目录的权限可以分配给用户组,这允许组内的所有成员共享特定的读、写、执行权限。通过组权限的设置,管理员可以实现更精细的权限控制和资源管理。
  1. 在实际运维中,其实组这个概念用得是比较少的,我到目前为止都还没用过,大家作为一个了解吧。
  2. 在小型的系统是很难用到组概念的,大型系统都会通过其他堡垒机方式来实现管理,并不需要针对单独的Linux服务器配置组策略。

Linux的权限介绍

在Linux系统中,每个文件和目录都有一个访问权限,用来保护数据的安全。这个权限分为三类,分别对应三种不同的用户:

  1. 文件拥有者(User):创建该文件或目录的用户。
  2. 用户组(Group):文件拥有者所在的用户组,用户组中的用户可以共享某些权限。
  3. 其他用户(Other):除了文件拥有者和用户组内的用户之外的其他用户。

每种用户都有以下三种权限:

  1. 读取权限(Read):用户可以读取文件的内容或列出目录的内容。用“r”表示,对应数值4。
  2. 写入权限(Write):用户可以修改文件的内容或在目录中创建和删除文件。用“w”表示,对应数值2。
  3. 执行权限(Execute):用户可以执行文件,或者进入和查看目录的内容。用“x”表示,对应数值1。

例如,如果一个文件的权限被设置为”755”,那么对应的权限是:

  • 文件拥有者:7(即4+2+1)拥有读、写、执行权限
  • 用户组:5(即4+0+1)拥有读、执行权限
  • 其他用户:5(即4+0+1)拥有读、执行权限

可以使用chmod命令来改变文件或目录的权限,使用chown命令来改变文件或目录的所有者,使用chgrp命令来改变文件或目录的用户组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
-rwxr--r--  1 root   root         688 May 15 15:45 check_port.py
-rw-r--r-- 1 root root 6852 Jun 6 15:04 DistributionInfo.json
drwxr-xr-x 10 root root 4096 May 6 2021 go
drwxr-xr-x 2 root root 4096 Jun 4 14:55 pgsql
drwxr-xr-x 10 109965 5000 4096 May 20 09:35 protobuf-2.6.1
drwxr-xr-x 8 user01 user01 4096 May 20 09:39 protobuf-c-1.2.1
-rwxr--r-- 4 root root 473 May 27 09:23 redis1.sh

1. 'd'头代表目录,'-'开头代表文件。
2. 'r'代表读权限,用数字4表示;'w'代表写权限,用数字2表示;'x'代表执行权限,用数字1表示。
3. 2个root 第一个代表用户,第二个root代表用户组。
4. 这里有一个文件用户和组都是普通用户user01。
5. 还有个109965和5000 ,及其他数字,一般情况下都是从windows上传的文件,就会出现这样的情况。
6. 如果把user01那个用户及组的对应的文件,复制到另外一台服务器,而这个服务器没有这个user01用户,那么复制过去以后的权限也会显示1000,1000(还要看对方服务器的用户占用的编号,可能会更大)。

在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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# ssh-keygen 输入该命令以后,一直回车即可。
# 这里也可以添加很多参数,甚至可以设置密钥的密码。

[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:4jzW3nqWv4wxN7j4v0LjFI+DUuYFVQ1xeiS6fUF3yGo root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
| ...==+.o|
| . . *+..|
| .. ..o |
| o ooE. . |
| .+So.=. . |
| o.oo *... |
| =..+++o |
| . o o*B . |
| +==+*o |
+----[SHA256]-----+

查看公钥和私钥

1
2
3
4
[root@localhost]# ls -l /root/.ssh/
总用量 8
-rw-------. 1 root root 1675 6月 28 22:57 id_rsa //私钥
-rw-r--r--. 1 root root 408 6月 28 22:57 id_rsa.pub //公钥

把公钥传输其他服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#需要输入对方服务器的密码
#也可以手工把id_rsa.pub文件的内容放到/root/.ssh/authorized_keys里面,注意权限
#我们把公钥传输到108服务器以后,我们可以免密登录108服务器
[root@localhost .ssh]# ssh-copy-id 192.168.179.108
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.179.108 (192.168.179.108)' can't be established.
ECDSA key fingerprint is SHA256:KcCHSnldK0xz0g82jmvKQ5bFYI8Wn04rPYbmK94nwhQ.
ECDSA key fingerprint is MD5:f3:3b:6d:09:54:06:57:b0:13:3a:75:e1:ca:79:70:bd.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.179.108's password:

Number of key(s) added: 1

Now try logging into the machine, with: "ssh '192.168.179.108'"
and check to make sure that only the key(s) you wanted were added.

查看远程服务器的公钥

1
2
3
4
5
6
#虽然公钥在原始服务器的名字是内容是/root/.ssh/id_rsa.pub,但是复制过来名字会变成authorized_keys
#如果该服务器允许多个其他机器过来免密登录,则该文件会有多行。
[root@localhost .ssh]# cd /root/.ssh/
[root@localhost .ssh]# ls -l
总用量 4
-rw-------. 1 root root 408 6月 28 23:02 authorized_keys

验证免密登录

1
2
3
4
5
6
# 未输入密码,也可以直接登录。
#登录的时候,它会读取本地私钥和服务器里面的公钥进行验证,验证通过则登录成功。

[root@localhost .ssh]# ssh 192.168.179.108
Last login: Fri Jun 28 23:09:05 2024 from 192.168.179.1
[root@localhost ~]#

总结

  1. 这里所有的操作都是基于root账号来操作的,实际上也可以普通账号来配置免密。
  2. 把私钥拿到win 也可以登录成功服务器,使用ssh软件,选择密钥登录也可以使用。
  3. 如果不做任何操作的情况下,它同时支持密码和密钥两种方式。也就是我可以拿密钥去登录,也可以拿密码去登录。
  4. 同一个服务器,允许配置多个公钥,让不同的私钥都可以使用免密登录。在实际authorized_keys文件里面就是体现有多行。
  5. 使用密钥登录可以避免密码被撞库的可能性,从而提高系统安全性。

22作为所有人都知道的ssh端口,它只要暴露在互联网,就会不停的面临暴力破解。我们最常用的做法就是修改端口,以及禁止root用户登录,使用一个普通账号登录,然后再使用sudo
或者su 方式来满足自己的运维需求。

修改SSH端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vi /etc/ssh/sshd_config
#默认这个参数是注释的,需要取消注释,并更换其中的端口
#这里其实是可以配置多个端口,可以根据实际修改
Port 22
Port 9508

#保存以后,重启服务,这个地方也需要小心,避免配置错误,把自己关在外面
systemctl restart sshd

#检查端口监听,默认是监听在所有ip,和ipv6同时开放,可以根据需要进行调整。
[root@localhost ~]# netstat -lnp |grep sshd
tcp 0 0 0.0.0.0:9508 0.0.0.0:* LISTEN 1086/sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1086/sshd
tcp6 0 0 :::9508 :::* LISTEN 1086/sshd
tcp6 0 0 :::22 :::* LISTEN 1086/sshd

禁止root登录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vi /etc/ssh/sshd_config
#默认这个参数也是注释的,需要改成下面这样
PermitRootLogin no

#保存以后,重启服务,这个地方也需要小心,避免配置错误,把自己关在外面
#生产环境先配置一个可登录的普通账号
systemctl restart sshd

#验证root登录失败
root@192.168.179.111's password:
Permission denied, please try again.

#普通用户登录成功
[root@localhost ~]# ssh user01@192.168.179.111
user01@192.168.179.111's password:
[user01@localhost ~]$

禁止密码登录,只允许密钥登录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vi /etc/ssh/sshd_config
PermitEmptyPasswords no
PasswordAuthentication no
#配置成下面这样

#保存以后,重启服务,这个地方也需要小心,避免配置错误,把自己关在外面
#生产环境需要先确认可以密钥登录
systemctl restart sshd

#没有输入密码的机会
[root@localhost ~]# ssh user01@192.168.179.111
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
[root@localhost ~]# ssh root@192.168.179.111
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

总结

  1. 修改端口,禁止root登录,只允许使用密钥,在实际运维中,可以根据自己需要进行选择一种或者多种组合。
  2. 当然实际情况下sshd的能够支持的配置还有很多,比如限制ip,或者只允许特定的用户或者组登录。
  3. 还有一个经常修改的参数是 UseDNS ,把它修改成no 可以加速ssh登录行为(这个里面涉及到一个dns概念,反向解析)。
  4. ssh在Linux服务器里面一般涉及到2个操作:一个是作为sshd的服务端,也可以是ssh作为连接其他人的客户端命令。

主机名与hosts

Linux系统中的主机名通常是指在网络中标识一个特定主机的名称。主机名在Linux中有几个不同的用途和设置方式:

主机名的作用:

  • 网络标识: 主机名是在网络中唯一标识你的Linux服务器或计算机的名称。它可以用来让其他设备和服务器识别和访问你的机器。
  • 系统配置:主机名通常用于配置文件中,例如 /etc/hostname 文件保存系统当前的主机名。
  • 命令行显示:当你登录到Linux系统的命令行终端时,主机名通常会显示在提示符中,以便你知道当前所在的主机,如果在部署的时候,没有配置,默认的主机名则是localhost
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost ~]# cat /etc/hostname 
localhost.localdomain
[root@localhost ~]#

# 设置主机名
#临时设置
hostname newhostname

#永久设置
[root@localhost ~]# hostnamectl set-hostname newhostname1
[root@localhost ~]# cat /etc/hostname
newhostname1

#无论临时设置,还是永久设置,设置完都是看不到主机变化的
#执行bash命令就可以立即看到,永久设置也可以重新登录以后看到

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服务器查询。

总结

  1. 一般情况下主机名可用于标注主机信息,让我们看到主机名字,就知道它是哪台机器,避免因为主机名字都相同而出现执行错误的指令(
    不同的主机主机名是可以可以一样的,只要他们之间不使用主机名通信即可,比如默认所有机器主机都是localhost)。
  2. hosts 可以用于模拟真实的域名解析,用于测试验证部分网络情况。比如在测试环境使用和真实环境使用一样的域名,来测试业务,就可以通过配置hosts来实现。
  3. 有一些集群软件,比如MQ,HDFS他们之间的通信是基于域名或者说主机名来通信的,这个时候我们需要配合主机名和HOSTS的合理配置,才能正常搭建这些软件。
  4. 主机可以可用来标识业务名字,也可以用来标识IP地址,具体根据需求灵活掌握即可。

ENV

在Linux系统中,环境变量扮演着非常重要的角色,用于配置系统和应用程序的运行环境。Linux环境变量可以影响命令行会话、运行的程序以及整个系统的行为。以下是一些常见的Linux环境变量及其作用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@newhostname1 network-scripts]# env
XDG_SESSION_ID=2
HOSTNAME=newhostname1
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.179.1 58431 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/etc/sysconfig/network-scripts
LANG=zh_CN.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=192.168.179.1 58431 192.168.179.111 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/env
OLDPWD=/root

常见的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后失效。
  • 查看环境变量:使用 echo 命令可以查看当前Shell中定义的环境变量,如 echo $PATH 可以显示 PATH 的值。
  • 永久设置
    • 永久设置的方式是设置到文件里面,主要涉及到下面几个文件
    • 用户级别:~/.bash_profile 或 ~/.profile 文件用于每次打开新的Shell会话时加载的配置。这里定义的环境变量通常也只对当前用户有效。
    • 系统级别:/etc/profile 或 /etc/environment 文件用于设置系统全局的环境变量,这些变量对系统中所有用户和进程都有效。
    • 设置以后,都要重新登录才会生效,如果要在当前shell生效,则要执行: source /etc/profile

总结

  1. env可以查看当前环境有哪些环境变量
  2. ~代表是家目录,比如root的家目录是/root,如果是user1的家目录则是/home/user1
  3. 在Linux里面以点”.”开头的文件或者目录就是隐藏文件,常规的ll或者ls都是看不到文件的,需要使用ls -a才可以看到。
  4. 在前面用户我们讲su命令的时候说过,su -l 或者su - 的时候会加载用户环境变量,加载的就是这里的的用户级别配置文件下的内容。
  5. 二进制软件包,可以通过添加环境变量的方式来直接访问,也可以直接放置到PATH对应的目录。比如最常见的JDK,一般都是通过把路径添加到环境变量里面然后访问。
  6. 环境变量的优先级确实是按照命令行设置 > 系统级别 > 用户级别的顺序。这意味着通过命令行直接设置的环境变量会优先于系统级别和用户级别的配置文件中的定义。
  7. 实际上以上那么多环境变量相关的配置文件,如果临时用,我就在命令行里面添加,要永久使用的,我都是写到/etc/profile这个文件里面。

Linux定时任务

在Linux中,可以使用crontab来设置和管理任务计划。crontab是一个用于定期执行命令或脚本的工具,可以按照指定的时间间隔自动运行任务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查看现有的crontab任务:使用以下命令可以查看当前用户的crontab任务列表:
crontab -l
# 编辑或创建新的crontab任务:使用以下命令可以编辑或创建一个新的crontab任务:
crontab -e
# 在打开的编辑器中,每行代表一个任务计划,格式如下:
* * * * * command
# 例如,如果要在每天的早上8点运行一个脚本,可以使用以下行:
0 8 * * * /path/to/script.sh
# 编辑完成后,保存并关闭编辑器,这里的操作方式和用vi编辑文件是一样的效果。

第一个星号表示分钟(0-59)
第二个星号表示小时(0-23)
第三个星号表示日期(1-31)
第四个星号表示月份(1-12)
第五个星号表示星期几(0-7,其中0和7都表示星期日)

# 删除crontab任务:如果要删除当前用户的所有crontab任务,可以使用以下命令:
#一般用的比较少,常用的是删除或者注释任务
crontab -r # 这将删除当前用户的所有crontab任务,请谨慎使用。

优先级说明

这五个时间单位的优先级从左到右依次降低。根据这五个时间单位的取值,可以设置不同的定时任务。例如:

  • 如果在分钟、小时、日期、月份和星期几的位置上都使用了星号(*),表示任务将在每分钟都执行。
  • 如果在分钟位置上使用了特定的数字,而其他位置上使用了星号(*),表示任务将在每小时的特定分钟执行。
  • 如果在小时位置上使用了特定的数字,而其他位置上使用了星号(*),表示任务将在每天的特定小时执行。
  • 如果在日期位置上使用了特定的数字,而其他位置上使用了星号(*),表示任务将在每月的特定日期执行。
  • 如果在月份位置上使用了特定的数字,而其他位置上使用了星号(*),表示任务将在每年的特定月份执行。
  • 如果在星期几位置上使用了特定的数字,而其他位置上使用了星号(*),表示任务将在每周的特定星期几执行。

请注意,星号(*)表示通配符,意味着该时间单位的所有取值都适用。而特定的数字表示具体的取值,例如1代表1号,2代表2点等。

根据具体需求,可以根据时间单位的优先级来设置crontab任务的时间间隔。请确保设置正确的时间间隔,以确保任务按预期执行。

每分钟,用 *

每2分钟,则用*/2

每5分钟,则用*/5

其他依次类推,绝大部分任务都是在分钟和小时2个参数进行调整。

主要用途

  • 定时切割日志,删除文件
  • 检查进程存活
  • 定期备份

总结

  1. Linux任务计划的规则其实很简单,只要理解到规则就可以根据自己的需要编写对应的规则。对应的规则可以直接是命令,也可以是脚本。
  2. Linux任务计划是分用户的,尤其是多用户运维的服务器。
  3. Linux任务计划最小粒度是分钟,如果需要更精细的角度来执行,可以通过把命令放置到脚本里面,然后通过脚本来实现秒级的粒度的控制。
  4. 在前面讲文件搜索的时候,我们讲过Linux有自带的几个目录,里面放置的就是根据单词提示的执行任务。这里的任务,通过crontab -l
    命令都是看不到的。如果有任务计划未按照预期执行,可以检查cron.deny 。
1
2
3
4
5
6
7
8
[root@localhost ~]# ls /etc/|grep cron
cron.d/ //系统部分自带会将任务放置在里面
cron.daily/ //每天执行
cron.deny //不允许执行任务计划的用户
cron.hourly/ //每小时执行
cron.monthly/ //每月执行
crontab //直接编辑就可以执行
cron.weekly/ //每周执行

软件安装

很多命令,默认最小安装的情况下,都是不自带的,都需要额外安装,那我们应该如何安装这些软件呢?

  • 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”才进行下一步。

总结

  1. 在实际运维过程中,一般用yum最多,rpm次之,编译安装目前已经使用很少了。这里实际上还衍生出来另外2个问题,我怎么知道我去哪里下载包(本地配置xxx.repo配置),服务器里面有些啥(yum源)。
  2. 在centos里面,yum update 会升级centos的版本,举个例子:如果我当前的版本是centos 7.5 ,但是最新的centos的版本是centos7.9,当我执行yum
    update以后就会把整个系统的版本升级到centos7.9。所以这个命令一般是在安装完成系统的时候进行系统初始化的时候就需要完成的,一般情况下,如果业务已经部署上去了,一般就不建议再执行该命令。
  3. 编译安装技能属于很有用,但是平时很少用到的技能,比如最近的OpenSSH严重的CVE-2024-6387漏洞,虽然OpenSSH早就发布了修复漏洞版本,但是他们发布的都是源码包,如果没有直接可用的安装包,就需要自己进行编译安装。
  4. 可以利用yum只下载不安装的特性,把下载的rpm包传递到需要安装的环境里面使用rpm包进行安装。
YUM

YUM源配置

在Linux有一个目录,/etc/yum.repos.d/这里的配置文件指定了yum命令去那个仓库下载文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[root@localhost]# ll /etc/yum.repos.d/
总用量 40
-rw-r--r--. 1 root root 2523 8月 4 2022 CentOS-Base.repo
-rw-r--r--. 1 root root 1309 9月 5 2019 CentOS-CR.repo
-rw-r--r--. 1 root root 649 9月 5 2019 CentOS-Debuginfo.repo
-rw-r--r--. 1 root root 314 9月 5 2019 CentOS-fasttrack.repo
-rw-r--r--. 1 root root 630 9月 5 2019 CentOS-Media.repo
-rw-r--r--. 1 root root 1331 9月 5 2019 CentOS-Sources.repo
-rw-r--r--. 1 root root 6639 9月 5 2019 CentOS-Vault.repo
-rw-r--r--. 1 root root 951 10月 3 2017 epel.repo
-rw-r--r--. 1 root root 1050 10月 3 2017 epel-testing.repo
# 但是这里要多提一句,由于centos7已经过了最后支持时间,所以centos关闭了域名解析,所以我们只能更换其他源。这里更换的是阿里源,当然也可以更换成其他源。
#备份当前配置
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
#下载阿里云的源
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

# 一般更换源以后都需要清理更新下本地缓存,这个缓存其实就是记录了软件的索引,和版本之间的依赖关系。加速yum命令的使用。
#清理缓存
yum clean all
#生成缓存
yum makecache

# 配置其他源
# 刚才配置的源,实际上是替代官方源,因为无论是阿里还是其他源,最终都是同步官方源,目前只是官方源关闭了,阿里云未关闭而已。但是这些源里面的软件包并不是最全的,版本也不是最新的。在这里使用最广泛的源叫epel源。上面epel.repo文件就是下面名字安装以后才会生成的文件。
yum -y install epel-release

# 安装特定源
# 刚才无论是配置的阿里源还是epel源都属于公共源,虽然里面有些软件源里面都有,但是它们的版本都是比较低的,这里举2个最简单的例子。
# Docker,在默认源里面的版本是1.13.1,但是这个版本已经非常老,甚至新版本的Docker的名字都发生了改变,改成了docker-ce。如果我们要安装比较新的版本就可以使用下面的方法。

#本应该使用官方源,但是由于docker仓库源被屏蔽的原因,原理是一样的
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

#这个安装了指定源以后,就可以安装最新版本Docker
yum install -y docker-ce

# Mysql,在centos7默认的源里面,甚至都找不到这个包,因为在centos7的源没有Mysql,只有Mariadb,至于他们的关系,又是另外一个故事,这里就不展开。

#下载源repo文件
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

#安装源
rpm -ivh mysql57-community-release-el7-11.noarch.rpm

#安装数据库
yum install -y mysql-community-server

本地源

下面是在CentOS等基于RPM的Linux发行版中配置本地Yum源的步骤:

  1. 挂载安装介质:首先,你需要将你的CentOS安装光盘(或ISO文件)挂载到某个目录,比如/mnt/cdrom。你可以使用以下命令来挂载:
1
2
3
4
5
6
7
8
9
#目前基本没有光盘了
mount /dev/cdrom /mnt/cdrom
# 选择本地iso,如果要选最全面的包,就要选最大的包,这里我只选了个折中的包,最大的包有差不多10G。

#挂载本地iso,提前准备好了目录和iso文件。
[root@localhost mnt]# mount -o loop /mnt/CentOS-7-x86_64-DVD-2009.iso /mnt/cdrom
mount: /dev/loop0 写保护,将以只读方式挂载
[root@localhost mnt]# df -h |grep cdrom
/dev/loop0 4.4G 4.4G 0 100% /mnt/cdrom
  1. 创建.repo
    文件:接下来,你需要在/etc/yum.repos.d/目录下创建一个新的.repo文件,比如myrepo.repo。你可以使用文本编辑器来创建和编辑这个文件。在这个文件中,你需要指定你的本地Yum源的名称、描述、路径等信息。
1
2
3
4
5
6
7
8
[myrepo]
name=My Repository
baseurl=file:///mnt/cdrom // 需要和上面挂载的路径一致
enabled=1
gpgcheck=0

# 这个为了方便验证要成功,最好把网络关掉,然后把其他repo文件都移走,才能避免干扰。
# 在这里,baseurl指定了你的本地Yum源的路径(即你的安装介质的挂载点)。enabled=1表示这个Yum源是启用的。gpgcheck=0表示不进行GPG签名检查。
  1. 清除Yum缓存
  2. 测试本地Yum源

局域网源

  1. 准备一台服务器:首先,你需要准备一台可以作为Yum服务器的机器,它需要有一定的硬盘空间来存放软件包,同时需要安装HTTP或FTP服务器软件,用于提供网络访问。
  2. 挂载并复制软件包:然后,把CentOS的安装光盘挂载到这台服务器上,我们就借用上小节的/mnt/cdrom目录。把所有文件复制到一个目录下,例如/mnt/centos7。
    • 因为iso或者光盘是只读的,而配置源会产生文件,所以需要复制出来单独的目录,而不能复用原来的只读目录。
  3. 安装createrepo:接下来,安装createrepo工具,这个工具可以创建Yum源需要的元数据信息: yum install -y createrepo
  4. 创建Yum源元数据:然后在存放软件包的目录下创建Yum源的元数据: createrepo /mnt/centos7
  5. 配置HTTP或FTP服务器:根据你的实际情况,配置HTTP或FTP服务器,使其可以提供对/mnt/centos7目录的访问。由于这里还没有讲web服务器,所以过程就略过。
  6. 在客户端配置Yum源:最后,在局域网内的其他机器上,你需要修改/etc/yum.repos.d/目录下的.repo文件,将baseurl设置为你的Yum服务器的地址,为了避免干扰,需要把其他repo文件移走。
1
2
3
4
5
[mylocal]
name=My Repository
baseurl=http://192.168.31.100/
enabled=1
gpgcheck=0
  1. 运行yum clean all和yum list命令:如果能列出软件包,说明Yum源已经配置成功。

总结

  1. 我们需要掌握的就是如何更换源,知道有些什么源可以更换,其实在实际运维中,不仅只有centos系需要源,其他系统也需要,甚至某些软件也需要更换源,比如pip,nodejs。
  2. 掌握对于某些特殊软件,比如Docker,Mysql等软件源的更换方法。
  3. /etc/yum.repos.d/目录下哪些文件,和仓库的也是对应关系的,有兴趣的可以下去了解下。
  4. 我们可以搭建本地iso源或者局域网源来满足yum命令的使用。
  5. 前面2个源,我们依赖的都是iso文件,但是这里的iso文件都是比较老的,我们可以通过去同步公网源来保持数据的及时性。
  6. 这里搭建的都是centos7的iso,那么能否搭建支持多个源的服务器呢?当然是可以的,这里需要稍微调整下目录即可。
  7. 如果yum源对应的服务器,不能上网,我们又该怎么办呢?
  8. 我们如何才能把服务器的源同步下来呢?总不能一个一个的下载把,这里其实有个rsync协议可以直接源里面指定的目录文件都下载下来,这个后期会单独讲这个命令。

时钟同步

ntp

任何一台电脑都会有一个本地时间的,由于CPU物理特性,它会越走越慢,如果我们管理着很多的服务器,但是他们的服务器时间不一样,这样会给我们业务带来问题的,现在很多业务对时间都非常敏感,所以我们必须保证我们的服务器的时间是一致的。

NTP,全称是Network Time
Protocol,即网络时间协议。它是用来同步网络中各个计算机的时钟的协议,使得网络中的计算机可以有一个一致的时间。它能够提供精确到亚秒级的时间同步,并且可以在计算机之间自动进行时间校对,以消除时钟漂移。

NTP常用于银行、股票交易、航空、电信等需要精确时间的领域,也是网络服务如email、数据库等应用的重要组成部分。

进行NTP配置是为了保证网络中的所有设备能够同步到准确的时间,这对于许多应用和服务来说是非常重要的。

  • 数据一致性:许多系统和应用依赖时间戳来跟踪事件或数据的更改。如果时间不一致,可能会导致数据错误或冲突。
  • 日志分析和故障排查:如果网络中的设备时间不一致,分析日志和故障排查会变得复杂和困难,因为无法准确知道事件发生的顺序。
  • 安全性:许多安全协议和技术(如Kerberos或SSL)都依赖于准确的时间。如果时间不准确,可能会引发安全问题,或者导致服务无法正常运行。
  • 高精度应用:一些高精度应用(如科学研究、金融交易等)需要非常准确的时间同步。
  • 法规合规:某些行业(如医疗、金融等)有法规要求对事件的时间进行精确记录。

配置NTP

  1. 安装ntp软件 yum -y install ntp
  2. 配置ntp #默认是centos官方的ntp服务器,可以根据需要更换 vi /etc/ntp.conf #启动ntp systemctl start ntpd systemctl enable ntpd
  3. 检查ntp同步状态 ntpq -pn

NTP说明

在没有安装ntp软件包的时候,我们如果要修改时间,只能通过date命令,直接来设置时间,但是这个时间设置随意性太强,不是很严谨。

通过yum安装ntp包以后,会安装出来2个命令,一个就是上图用到的ntpq,主要用于ntpd状态查询;另外一个就是ntpdate,它可以用户同步其他ntp服务器的时间。

1
2
[root@localhost ~]# ntpdate ntp.aliyun.com
29 Jul 23:12:25 ntpdate[1202]: adjust time server 203.107.6.88 offset 0.008099 sec

总结下来,安装ntp软件包以后,我们有2种方式可以去同步时间,一个是使用ntpdate命令去同步,一个是通过ntpd服务方式去同步。

如果是使用ntpdate去同步,则需要配合我们前面讲到的任务计划(crontab),因为ntpdate执行同步,执行的是一次性任务。而使用的ntpd是以服务方式,是自动同步的。

NTP服务端

上面我们讲的ntpd也好,还是ntpdate也好,实际上都是作为ntp客户端的,但是我们有很多服务器,都处于内网,并且是不能上网的,他们是无法连接到公网的,所以我们就需要给这些内网的服务器搭建一个内网的ntp服务器,作为服务端给下游其他机器提供ntp服务。

如果我们选择作为ntp服务器的服务器,是可以通公网的,那么他只要按照服务方式启动ntp服务就可以作为ntp服务器,ntp服务是一个特殊服务,他既可作为服务端,也可以作为客户端。其他ntp客户端机器只要把ntp.conf里面的ntp服务器地址换成我们选定的服务器就可以。

如果我们选择的ntp服务器是没有上网能力,就只能以自己的时间作为标准,向下游提供服务。

  1. 修改配置文件
1
2
3
server 127.127.1.0 iburst
#注释其他server,添加上面这样,重启服务
#这个配置就是以自己为标准时间
  1. 服务端检查ntp服务状态
1
2
3
4
[root@localhost ~]# ntpq -pn
remote refid st t when poll reach delay offset jitter
==============================================================================
*127.127.1.0 .LOCL. 5 l 2 64 1 0.000 0.000 0.000
  1. 客户端检查ntp服务状态
1
2
3
4
[root@localhost ~]# ntpq -pn
remote refid st t when poll reach delay offset jitter
==============================================================================
*192.168.31.104 LOCAL(0) 6 u 2 64 1 0.275 -4.114 0.018

总结

  • ntp使用很简单,但是在超大规模的情况下要想保证整个环境的稳定和可靠还是有很多事情需要做的。
  • 上面的配置只考虑验证基本功能,并没有考虑到时间误差过大会发生什么,ntp并没有高可用等问题。
  • 另外ntpq -pn 下面的很多参数也没有讲解是啥意思,有兴趣可以自己去查下。
  • 我本人也有多年维护某大厂私有云平台ntp服务的经验,如果有兴趣可以和我交流。
  • ntp服务是不怕故障的,ntp怕的是时间跳变。
chrony

其实在NTP时间同步协议里面常用的软件有2个,一个就是上小节讲的软件ntp,另外一个就是本小节要讲的另外一个软件chrony,这2个软件都有类似的功能,目前国内的公有云厂商,有的厂商给用户提供的ntp,有的给用户的提供的chrony。

这2个软件,在默认情况下是互斥的,也就是只能同时启动一个,后启动的会把先启动的服务给停止掉。甚至默认情况下ntpdate命令和ntpd服务都是互斥的就算他们是一个软件包安装出来的,也就是ntpd服务在运行的时候,ntpdate命令我是无法执行的。

chrony在最小化安装的centos7系统里面都是自带的,如果不配置就和ntp一样,都是使用官方默认的源。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@localhost ~]# chronyc sources
210 Number of sources = 7
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 100.100.61.88 1 10 377 655 -1634us[-1629us] +/- 29ms
^+ 100.100.3.1 2 10 377 313 +18us[ +18us] +/- 20ms
^+ 100.100.3.2 2 10 377 695 +6110us[+6115us] +/- 25ms
^+ 100.100.3.3 2 10 227 33m +3569us[+3521us] +/- 26ms
^+ 100.100.5.1 2 10 377 980 +24us[ +29us] +/- 20ms
^+ 100.100.5.2 2 10 377 464 +931us[ +931us] +/- 21ms
^+ 100.100.5.3 2 10 377 1008 -54us[ -48us] +/- 20ms

# MS Name/IP address: 当前chrony客户端的上游服务器,其中"*"代表当前上级源,"+"代表参考,"*"只能有一个,"+"可以有多个。
# Stratum: 数字越小,代表级别越高。
# Poll: 代表同步时间间隔,这个10是最大,也就是1024秒同步一次,这个服务启动的时间一般都比较小,当同步越稳定就是同步的间隔就越低。
# Reach: 代表最近8次同步状态,其中377代表8次都成功,如果有一次不成功则不是377。
# LastRx: 最近一次同步过去了多少时间,这个和前面的Poll对应,Poll越大,LastRx的值才可能越大。
# Last sample: 代表和上游服务器的误差,有正,也有负数,正常的可以接受的大小大概是几十毫秒或者更低的微秒。
# 上面的参数和ntpd -pn 显示参数基本上是一样的。
# chronyd默认是监听127.0.0.1,也就是他默认只能当作客户端,不能作为服务端。

总结

  1. 无论是ntp还是chrony,他们使用的协议都是udp,而不是一般常用的tcp协议,这个需要注意。
  2. 作为服务端,我要考虑他怎么给客户端提供稳定可靠的服务(高可用,防止跳变)。
  3. 作为客户端,我需要考虑的就是如果服务端故障(chrony其实不怕故障),或者说服务端时间发生跳变,我怎么来降低他对我的影响。

DNS服务

通过hosts是可以跳过dns解析的,那什么是dns,为什么要有dns呢?

DNS,全称是“Domain Name System”或者叫“域名系统”,是互联网的一种服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP数串。

在互联网上,每个接入网络的设备都会被分配一个唯一的IP地址,你可以把它理解为互联网上的电话号码。当你想访问一个网站时,你的电脑实际上是向该网站服务器的IP地址发送请求。然而,IP地址是一串数字,对人类来说记忆起来相对困难。这时候,DNS就派上了用场,它的作用就是将这串数字的IP地址转换成更易于记忆的域名,比如Linux自带的默认情况下localhost就代表本机IP地址。

例如,当你在浏览器中输入www.qq.com时,你的计算机会首先询问DNS服务器www.qq.com的IP地址,然后DNS服务器会返回对应的IP地址给你的计算机,之后你的计算机才能通过该IP地址去访问qq.com服务器。这个过程被称为DNS解析。

Linux解析流程

  1. 用户请求:用户在应用程序(比如浏览器、命令行等)中输入域名,例如 www.example.com。
  2. 查找本地缓存:但是这个缓存,默认情况下是看不到的。我通过抓包测试连续两次dns查询,也都是需要向dns发出请求的。所以我对这个缓存其实一直都是存疑的,但是实际运维中也确实遇到过解析异常的情况。
  3. 查询/etc/hosts文件:如果在本地缓存中找不到对应的IP地址,系统会检查 /etc/hosts
    文件,这个文件可以手动配置域名和IP地址的映射关系。如果在这里找到了,也会直接返回IP地址给应用程序。
  4. 向DNS解析器发起查询:如果本地缓存和 /etc/hosts 文件中都没有找到对应的IP地址,系统会向预先配置的DNS解析器发起查询请求。DNS解析器通常在
    /etc/resolv.conf 文件中指定,例如:
1
2
3
nameserver 223.5.5.5
nameserver 114.144.144.114
这里的233.5.5.5 和114.114.114.114 则是国内提供的公共dns,可以替换为其他DNS服务器的IP地址。
  1. DNS解析器查询过程:
    - 这里的dns服务器可以分为迭代和递归两种:

    迭代查询:在迭代查询中,当客户端向DNS服务器查询时,如果该服务器没有存储查询的信息,它会将能够提供信息的其他服务器的地址返回给客户端,让客户端去那个服务器查找。也就是说,DNS服务器不会自己去查询,而是告诉客户端应该去哪里查找。
    • 递归查询:在递归查询中,当客户端向DNS服务器查询时,如果该服务器没有存储查询的信息,它会代表客户端去其他服务器查询,直到找到答案才返回给客户端。在这个过程中,客户端只需要等待最终结果,所有的查询工作都由DNS服务器完成。
    • 总结下来其实很简单,迭代自己没有答案,但是他会告诉你哪里有答案。递归他帮你去找到答案,然后告诉你答案。目前大部分dns都是递归。
  2. 解析结果返回: DNS解析器将获取到的IP地址返回给系统的resolver,并且缓存这个结果。同时,将IP地址返回给应用程序,应用程序可以继续向该IP地址发送网络请求。
  3. 应用程序通信: 应用程序拿到IP地址后,可以与目标服务器建立通信,发送HTTP请求等操作。

Linux的dns配置文件

前面讲过linux的dns配置文件是/etc/resolv.conf,他除了配置了dns服务器,还有其他配置,分别是什么意思,如果遇到解析失败他怎么办?

  • nameserver :就是dns服务器地址,最多可以写3个。
  • search:搜索域,一般环境用不到,但是在k8s里面会搜索svc的时候会用到这个特性。大概意思就是你查询一个域名,如果没查到解析,他再给你添加个后缀,再进行查询。
  • options:
    • timeout 如果在设定时间未返回数据,则他会请求下一个dns服务器查询。
    • attempts: 如果所有dns都查询了都失败了,他在重复这个操作的次数。
    • 如果你的dns解析很慢,可以注意看这2个参数。

总结

  1. Linux的dns是一个很核心的基础服务,几乎所有的业务请求都是通过域名来实现,这样所有的请求都会通过dns才能正常使用。
  2. 有的程序并不会使用系统dns逻辑,而是程序自带的dns逻辑,这样就可能导致业务和实际预期不一样的情况。
搭建私有dns服务器

基本命令

  • ping:最简单的使用方式,也是使用最多的方式。
  • nslookup:比ping有更多的功能。
  • dig:比nslookup更新的支持更广泛的命令
  • dig命令和nslookup命令在最小化安装的系统里面都是默认不自带的,需要安装包bind-utils才有这2个命令

在内部环境,有些会使用一些自定义的域名,用户指向某些内部服务,在各个公有云基本都有内网dns这个产品,道理其实是一样的。然后如果其他域名,他无法解析,他则可以通过递归的方式去请求上游dns服务器,然后返回给用户。这里就涉及2个配置:一个是递归到上游服务器,另外一个提供内部dns解析服务。

  1. 安装dns软件:dns软件其实也有很多,我们这里以unbound来举例。 yum -y install unbound
  2. 配置dns转发
1
2
3
4
5
6
7
8
9
10
11
12
vi /etc/unbound/unbound.conf 

server:
interface: 0.0.0.0 # 监听所有网卡接口上的请求
access-control: 0.0.0.0/0 allow # 允许所有IP地址访问

forward-zone:
name: "." #代表所有域名
forward-addr: 61.139.2.69 #可以替换自己的dns

#这里的name可以匹配一个类型的域名,比如.com
#通过这样可以控制内网用户对外请求,或者不同的域名指向不同的dns服务器
  1. 配置私有域名
1
2
3
4
5
6
7
8
9
10
#名字可以自己自己定义
vi /etc/unbound/local.d/yunwei.conf

# 私有域名
#iprivate-domain: "yumwei.com"
local-zone: "yumwei.com." static

# 私有域名的A记录
local-data: "server1.yunwei.com. IN A 192.168.1.1"
local-data: "server2.yunwei.com. IN A 192.168.1.2"
  1. 配置服务端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost ~]# cat /etc/unbound/unbound.conf 
server:
interface: 0.0.0.0
port: 53
access-control: 0.0.0.0/0 allow


# 私有域名
#iprivate-domain: "yumwei.com"
local-zone: "yumwei.com." static

# 私有域名的A记录
local-data: "server1.yunwei.com. IN A 192.168.1.1"
local-data: "server2.yunwei.com. IN A 192.168.1.2"

# 配置前向区域
forward-zone:
name: "."
forward-addr: 223.5.5.5
#合并到一起的代码,重启dns生效
systemctl restart unbound

总结

  1. 这里的配置实现了unbound的两大核心功能,内部域名和递归转发。
  2. 核心功能还有很多,比如缓存,比如用户请求了qq.cm,dns可以把结果缓存到自己内部,如果有人再次来请求他,就直接返回给他,而不用在向上递归查询。
  3. 实际运维可以经常更新的内部域名放到/etc/unbound/local.d/目录下,运维起来会更轻松。

NFS服务

NFS(Network File System)是一种分布式文件系统协议,用于在网络上共享文件和目录。它允许多个计算机系统通过网络访问和共享存储在远程文件服务器上的文件。

搭建nfs

nfs服务分服务端和客户端,在公有云里面,厂商负责提供服务端,客户端(虚拟机)只要有对应的命令就可以正常挂载使用。

服务端搭建

  1. 安装nfs软件 yum install nfs-utils -y
  2. 配置nfs
1
2
3
4
5
#编辑文件
vi /etc/exports

#根据需要配置需要共享的目录,保存退出
/home *(rw,sync,no_root_squash)
  1. 更新配置 exportfs -r
  2. 启动nfs
1
2
3
systemctl start nfs-server
systemctl enable nfs-server
#其实启动nfs服务的时候还会启动一个rpcbind的服务

客户端部署

  1. 部署nfs软件 yum install nfs-utils -y
    • #服务端和客户端其实需要安装的软件是一样的
    • #只是服务端需要配置如何提供服务,而客户端不需要,和ntpd其实比较类似
  2. 创建测试目录 mkdir /test
  3. 测试挂载
    • #具体ip和路径以实际配置为准 mount -t nfs 192.168.0.239:/home /test

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

  1. 安装lvm命令 yum install lvm2
  2. 准备磁盘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#准备了一个裸盘,一个分区
[root@localhost ~]# fdisk -l
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x67aa216a

设备 Boot Start End Blocks Id System
/dev/sdb1 2048 41943039 20970496 83 Linux

磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
  1. 创建pv
1
2
3
4
5
6
7
8
#由于sdb1是分区,所以提示需要擦除。
#所以这里用裸盘比较合适
[root@localhost ~]# pvcreate /dev/sdb1
WARNING: ext4 signature detected on /dev/sdb1 at offset 1080. Wipe it? [y/n]: y
Wiping ext4 signature on /dev/sdb1.
Physical volume "/dev/sdb1" successfully created.
[root@localhost ~]# pvcreate /dev/sdc
Physical volume "/dev/sdc" successfully created.
  1. 创建vg
1
2
3
4
5
[root@localhost ~]# vgcreate myvg /dev/sdb1
Volume group "myvg" successfully created
[root@localhost ~]# vgextend myvg /dev/sdc
Volume group "myvg" successfully extended
#先创建vg,然后往vg里面加pv或者说磁盘
  1. 创建lv
1
2
[root@localhost ~]# lvcreate -L 10G -n mylv myvg
Logical volume "mylv" created.
  1. 格式化&挂载
1
2
3
mkfs.ext4 /dev/myvg/mylv
mkdir /test
mount /dev/myvg/mylv /test
  1. 扩容&缩容
1
2
3
4
5
6
7
8
9
10
11
12
# 注意:这里扩容只是增加lv大小,实际到文件系统还需要再进行操作。另外就是ext4和xfs可以扩容,但是xfs还可以缩容。
# 无论是缩容lvm还是磁盘需要慎重。


[root@localhost ~]# lvextend -L +2G /dev/myvg/mylv
Size of logical volume myvg/mylv changed from 10.00 GiB (2560 extents) to 12.00 GiB (3072 extents).
Logical volume myvg/mylv successfully resized.


[root@localhost ~]# lvextend -L +2G /dev/myvg/mylv
Size of logical volume myvg/mylv changed from 10.00 GiB (2560 extents) to 12.00 GiB (3072 extents).
Logical volume myvg/mylv successfully resized.

总结

  1. 无论是分区还是磁盘都可以作为lv加入到lvm里面使用,但是原始里面的是数据会丢失。
  2. lvm一句话概括就是创建pv,组成vg,然后再分成lv使用。
  3. 这里只简单写了lvm的基本创建和使用功能,里面还有很多命令并没有讲。
  4. 在centos7安装过程中,在磁盘分区的时候,如果不对磁盘做任何操作,默认就是以lvm格式安装操作系统。
  5. 有些分布式系统,对文件系统是有一定要求的,lvm是不满足要求的。

SELinux

SELinux(Security-Enhanced Linux)是一种安全增强型的Linux安全子系统,由美国国家安全局(NSA)开发,旨在增强Linux系统的安全性。它通过实施强制访问控制(MAC)来提供高级的安全保护机制。

具体来说,SELinux引入了一种额外的安全层,不同于传统的自由访问控制(DAC)。在DAC中,每个文件、进程或用户可以自行设定权限,并且用户可以超越其他用户拥有更高权限。这可能导致安全漏洞,因为任何一个受损的进程都可以访问系统上的任何资源。

虽然SElinux很安全,但是在实际运维中,除了特殊要求,一般都会关闭selinux。因为如果要使用Selinux,软件或者应用程序需要很复杂的配置才可以。

1
2
3
4
5
#临时关闭,重启失效
setenforce 0
#修改配置文件,重启以后生效
#也可以通过vi进行修改
sed -i 's/enforcing/disabled/' /etc/selinux/config

库文件
我们在介绍如何让Docker镜像最小化的时候,有提过以下这个库文件,在平时使用也是不容易感知到这个库文件的。在Linux基本目录介绍的时候,也说过有2个目录:/lib
/lib64是库文件目录,存放系统动态链接库和内核模块。

在Linux的哲学里面一切皆文件里面,我们对Linux的操作实际上就是对文件进行增删查改,这些基础功能底层逻辑就是各种函数,相当于系统把这些功能封装在各种函数里面,供应用程序去调用。

  • 文件读写函数:如 fopen、fclose、fread、fwrite 等,用于打开、关闭、读取和写入文件。
  • 终端输入输出函数:如 printf、scanf、fgets、fputs 等,用于从终端读取输入和输出结果。
  • 系统调用函数:如 read、write 等,用于直接与文件描述符进行交互,提供更底层的文件操作能力。

这些上面的函数都集成在系统的库文件里面如果我们自己开发的程序能力,就需要使用到这些库文件,这就是动态库,供操作系统的程序调用。和动态库对应的就是静态库。所以静态库,就不只依赖自己,完全不依赖系统自带的库文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#动态库
[root@localhost ~]# ldd /usr/bin/python
linux-vdso.so.1 => (0x00007ffd632ce000)
libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007f96125a0000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f9612384000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f9612180000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f9611f7d000)
libm.so.6 => /lib64/libm.so.6 (0x00007f9611c7b000)
libc.so.6 => /lib64/libc.so.6 (0x00007f96118ad000)
/lib64/ld-linux-x86-64.so.2 (0x00007f961296c000)

#静态库
[root@localhost ~]# ldd /usr/bin/cd
不是动态可执行文件

总结

  1. selinux如果不使用,一般都需要在系统进行初始化或者制作通用模板的时候就把永久关闭掉。
  2. 库文件一般只有在进行某些软件的编译安装的时候会涉及到库文件因为版本不对导致异常的清空。

SWAP

Swap是计算机系统中用于暂时存放内存数据的一种技术。它通常指的是交换空间(swap
space),是一种虚拟内存的扩展,用于在物理内存不足时将不活动的内存页从RAM(随机存取存储器)移动到硬盘上的一部分空间。这样,RAM中可以腾出空间来加载当前需要的数据和程序。

目前来说,对于动辄几百G,甚至上T的内存面前,swap已经基本没有使用的必要了,但是在互联网早期,内存都很低的情况,swap是提高系统性能的一种重要方法。而且在centos7安装的时候无论默认的lvm还是标准分区,都会单独拿一块分区出来用作swap。只是随着内存的提高,就算开启了swap也会关闭swap功能,而且k8s这个软件在某些版本里面默认情况下,如果有swap还无法启动成功。

  • 关闭swap swapoff -a
  • 开启swap
1
2
3
4
5
6
7
8
9
10
11
#创建一个文件,大小,路径,名字都可以自定义
dd if=/dev/zero of=/swapfile bs=1M count=1024
#设置权限,保证安全
chmod 600 /swapfile
#标记为swap文件
mkswap /swapfile
#启动swap
swapon /swapfile

#如果要永久启用,需配置fstab
/swapfile none swap sw 0 0

总结

  1. swap
    ,如果没开则不需要管,如果开启了,也可以在初始化的时候进行关闭,看swap是否正常,其实主要看他的动态变化,如果变化大,说明内存和磁盘在进行大量数据交换,会影响性能。如果变化很小或者几乎没有变化,则说明使用不频繁则不会有啥问题。
  2. 在内核里面还有个参数,可用于swap的介入程度,数字越小,就是让swap介入越低。

Linux日志

message日志

在Linux系统中,message 日志通常指的是系统日志(system
logs)中的一部分,这些日志记录了系统和应用程序的各种信息、警告和错误。message日志也是我们在日常运维中查看使用最最频繁的日志,没有之一。是属于文本格式的日志,可以直接用Linux操作普通文件的命令来分析。主要记录以下日志

  • 系统启动和关机信息:记录系统何时启动和关机,以及相关的详细信息。
  • 服务启动和停止信息:记录各种系统服务(如网络服务、数据库服务等)的启动、停止或重启的信息。
  • 内核消息:包括关于硬件、驱动程序和内核的运行时消息。
  • 一般的系统运行消息:例如系统运行时的一般信息、警告和调试信息。

日志基本信息

  • 日志路径:/var/log/message
    • 日志格式: 文本格式
    • 查看方法:普通查看文件命令,tail cat vi 等命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#手工修改日志
[root@iZ2vci40gfjzarlead7vliZ ~]# date -s 15:49:00
Tue Jul 2 15:49:00 CST 2024

#日志记录
cat /var/log/messages|grep "Time has"
Jul 2 15:49:00 iZ2vci40gfjzarlead7vliZ systemd: Time has been changed


#是看不出来为什么启动失败的
[root@iZ2vci40gfjzarlead7vliZ ~]# systemctl restart docker
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
[root@iZ2vci40gfjzarlead7vliZ ~]# systemctl status docker.service
# 日志内容略 分析日志确定原因

总结

  • message日志是最重要的分析系统情况的日志,没有之一。
  • message日志记录的字段里面记录,时间,主机名,用户(用这个用户可以更明显的确认日志来源)
  • 这个用户有kernel,systemd,journal,应用程序(docker,nginx这些)
  • 分析系统崩溃,程序启动失败等都会用到他
  • 甚至在根分区磁盘不够的情况下,首先要删除的也是message日志
  • 参与logrotate的日志轮转进行更新,避免把磁盘打满。

secure日志

在Linux系统中,secure 日志是系统日志的一部分,主要用于记录与系统安全相关的活动和事件。一般情况下,我们没有安全相关的需求是不会分析这个日志的,这个日志主要记录一下几个方面的内容。

  • 用户登录和认证:
    • 记录用户登录系统的事件,包括成功和失败的登录尝试。
    • 记录用户使用的认证方法,如密码、SSH密钥等。
  • sudo 使用记录:
    • 记录使用 sudo 命令进行特权操作的用户和时间。
    • 记录特权操作的成功和失败情况。
  • 安全策略变更:
    • 记录安全策略的修改,如用户权限的变更、密码策略的更新等。
  • 系统服务启动和停止:
    • 记录系统服务的启动、停止或重启的信息,这些操作可能会涉及到特权操作或安全相关的服务。
  • 防火墙和安全组规则:
    • 记录防火墙(如iptables)或安全组(如ufw)规则的变更或拒绝的尝试。
  • 系统安全事件:
    • 记录系统可能遭受到的攻击或异常行为,如登录失败的暴力攻击尝试、拒绝服务攻击的迹象等。

日志基本信息

  • 日志路径:/var/log/secure
  • 日志格式: 文本格式
  • 查看方法:普通查看文件方法:tail cat vi 等命令

总结

  1. 该日志主要主要是和安全登录相关,只要暴露了攻击面,就会被暴力破解。
  2. 当然只要没有人恶意连续大量的连接,一般情况下倒是可以忽略不计的。
  3. 当然从安全的角度来说,我们需要减少暴露面,强密码来保证服务器的安全。

btmp日志

在Linux系统中,btmp 日志是系统日志的一部分,它记录了所有登录失败的尝试,包括失败的登录用户名、登录失败的时间以及登录失败的来源
IP 地址。

  • 记录失败登录时间:准确记录每次错误登录发生的时间,精确到秒甚至更小的时间单位。这对于分析在特定时间段内是否存在异常的登录活动非常重要。例如,如果在凌晨时分出现了大量不正常的登录尝试,可能意味着存在潜在的安全威胁,如黑客试图暴力破解密码。
  • 登录用户信息:记录尝试登录的用户名。通过分析频繁被尝试登录的用户名,可以确定哪些账户可能成为攻击目标。如果某些具有管理员权限的用户名被频繁尝试登录,就需要特别关注并加强相关账户的安全措施。
  • 登录来源信息:在某些情况下,还可能记录登录尝试的来源 IP 地址。这对于追踪可能的恶意攻击者的位置或识别来自特定网络区域的异常活动很有帮助。如果发现某个
    IP 地址不断尝试错误登录多个账户,就可以将该 IP 地址列入黑名单或采取其他相应的安全措施。

日志基本信息

  • 日志路径:/var/log/btmp
  • 日志格式: 二级制格式
  • 查看方法:使用专用命令lastb

总结

  1. 这个日志也是属于平时关注比较少的日志,如果未开放到公网或者限制比较严格,这里应该只有很少记录。
  2. 如果没有暴露面,也确实不用怎么关注他。
  3. 如果暴露到公网,我们可以根据上面的情况做一些针对性的限制(比如错误达到几次就自动屏蔽)。

wtmp日志

在Linux系统中,wtmp 日志是系统日志的一部分,它主要用于记录系统的登录和注销等相关信息。这个刚好和btmp相对应,一个记录失败,一个记录成功。

  • 记录登录和注销时间:它准确地记录了用户登录到系统的时间以及注销的时间。这对于跟踪用户的活动时间以及系统的使用情况非常重要。例如,管理员可以通过查看
    wtmp 日志来确定某个用户在特定时间段内的登录时长,从而了解用户对系统资源的使用情况。
  • 记录用户身份信息:wtmp 日志会记录登录用户的用户名等身份信息。这有助于管理员识别哪些用户在何时访问了系统。在多用户环境中,如果出现了系统问题或安全事件,通过查看
    wtmp 日志可以快速确定当时登录的用户,以便进一步调查相关情况。
  • 记录登录终端和来源信息:它还可能记录用户登录的终端设备(如本地终端、远程登录的终端类型等)以及登录的来源 IP
    地址(如果是远程登录)。这对于了解用户的登录方式和位置很有帮助。例如,如果发现某个用户经常从不同的 IP
    地址登录,可能需要进一步核实该用户的身份和活动是否正常。

日志基本信息

  • 日志路径:/var/log/wtmp
  • 日志格式: 二进制格式
  • 查看方法:使用专用命令last

总结

  1. 该日志主要记录成功的日志,如果服务器运行的时间越长,他记录的信息越多。
  2. 当日常运维中需要查询某个命令是谁执行的就可以通过history和该记录进行综合分析。
  3. 该日志记录的用户,来源ip,登录时间,登出时间。

lastlog日志

在Linux系统中,lastlog日志是系统日志的一部分,主要用于记录每个用户最后一次登录时间的日志文件。

  • 跟踪用户登录情况:
    • 它记录了每个系统用户最后一次成功登录系统的时间。这对于管理员了解用户对系统的使用频率和最近的活动情况非常有帮助。例如,如果某个用户长时间没有登录,管理员可以检查该用户是否仍然需要该账户,或者是否存在账户闲置浪费系统资源的情况。
    • 通过对比不同时间点的 lastlog 记录,可以发现用户登录行为的变化。比如某个用户原本每周都会登录,突然连续几周没有登录记录,可能意味着该用户的工作职责或使用需求发生了改变。
  • 安全监测:
    • 在安全方面,lastlog 日志可以作为一种监测手段。如果发现某个用户的最后登录时间与预期不符,比如用户声称自己没有登录过,但
      lastlog 显示有近期的登录记录,这可能表明该用户账户存在安全风险,可能被他人盗用。
    • 对于新创建的用户,lastlog 初始时是没有记录的。当该用户首次登录后,lastlog 会记录下登录时间。这样管理员可以通过查看
      lastlog 来确定新用户是否已经开始正常使用系统,以及是否存在异常的首次登录情况(如在不应该的时间或地点登录)

日志基本信息

  • 日志路径:/var/log/lastlog
  • 日志格式: 二进制格式
  • 查看方法:使用专用命令lastlog

总结

  1. 他会统计linux所有的用户(/etc/passwd)里面的所有用户,无论他们是否有登录权限
  2. 有些服务,比如nginx,默认是不允许交互登录的,如果你尝试使用了su命令去切换登录,这里也会记录你登录。
  3. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看cpu信息
#默认是查看cpu信息,前面显示的,是24小时前的,最近的在最下面
[root@localhost sa]# sar

# 查看磁盘io信息
[root@localhost sa]# sar -b

# 查看内存信息
[root@localhost sa]# sar -r

# 查看网络信息
[root@localhost sa]# sar -n DEV

# 查看历史信息
#保留最近一个月的数据,可以和上面的其他指标组合查询
#不同的数字代表本月或者上月的某一天
sar -f /var/log/sa/sa25

总结

  • 默认最小化安装是没有这个命令的,可以安装这个命令来替代部分监控的作用。
  • 在历史业务异常的时候,也可以通过查看历史监控信息来分析可能存在的问题。

journal日志

journal 是 Linux 系统中的系统日志管理工具,它是 systemd 的一部分,提供了一个集中的方式来收集、管理和查看系统日志。journal
相比传统的 syslogd 和 rsyslogd 等日志系统,具有更强的功能和灵活性。

所以,简单来说:journal并不是日志,而是日志管理工具。

  • 统一的日志存储:
    • 它将来自不同来源的日志信息集中存储在一个统一的日志系统中。这包括内核日志、系统服务日志、应用程序日志等。不再像传统的
      Linux 日志系统那样分散在多个不同的文件中(如/var/log/messages、/var/log/syslog
      等)。例如,当系统启动时,内核的初始化信息、各个服务的启动过程以及应用程序的相关事件都可以在 Journal 中连贯地记录下来。
    • 这种统一存储使得查找和分析日志更加方便。你不需要在多个不同的文件中切换查找相关信息,只需要在 Journal 日志中进行搜索即可。
  • 高效的存储和访问方式:
    • Journal 采用了基于数据库的存储方式,能够快速地写入和检索日志信息。它使用了索引和优化的数据结构,相比传统的基于文本文件的日志系统,在处理大量日志数据时具有更高的性能。
    • 当你需要查询某个特定时间段内的日志或者搜索特定关键词时,Journal
      能够快速地定位并返回结果。例如,在排查一个在特定时间点发生的系统故障时,可以迅速找到该时间附近的相关日志记录。
  • 支持多种日志格式:
    • Journal 可以处理不同格式的日志信息,包括文本格式和结构化数据格式。对于一些现代的应用程序和服务,它们可以将更丰富的结构化数据写入
      Journal,这样在分析日志时可以获取更多的细节信息。
    • 比如,一个网络服务可以将连接的 IP 地址、端口号、请求的时间等结构化信息作为日志记录在 Journal 中,方便管理员进行更精确的分析和监控。

日志基本信息

  • 日志路径:/var/log/journal(目录)
  • 日志格式: 二进制格式
  • 查看方法:使用专用命令journalctl
1
2
3
4
5
6
7
8
# 从头显示日志
[root@lcoalhost journal]# journalctl
# 查看最新的日志
[root@localhost journal]# journalctl -f
# 查看指定时间的日志
[root@localhost journal]# journalctl --since "2024-08-08 10:00:00" --until "2024-08-09 12:00:00" -- Logs begin at Mon 2024-05-13 09:03:04 CST, end at Fri 2024-08-09 23:53:01 CST. --
# 查看指定服务的日志
[root@localhost journal]# journalctl -u docker -- Logs begin at Mon 2024-05-13 09:03:04 CST, end at Fri 2024-08-09 23:55:01 CST. --

总结

  • 这里只是简单说了下journal的日志使用方法,具体还有很多功能都没说明。
  • 从前面的日志我们其实可以看到journal和message和cron等日志是有重叠的,其实我一般都很少看这个日志。
  • 很多服务启动失败,会直接提示你使用journal命令查看。

dmesg日志

在 Linux 系统中,dmesg是一个用于查看内核环形缓冲区(kernel ring buffer)内容的命令。它主要记录了系统启动时的内核信息以及内核在运行过程中的一些关键事件和错误等。

dmesg 的作用

  • 系统启动信息:
    • dmesg可以显示系统启动过程中的详细信息,包括硬件检测、驱动初始化等。例如,当系统启动时,它会显示关于 CPU
      型号、内存大小、硬盘识别等信息。这对于了解系统硬件配置和排查启动问题非常有帮助。
    • 比如,在启动过程中,如果某个硬件设备没有被正确识别,dmesg中可能会有相关的错误提示,帮助你确定问题所在。
  • 内核事件和错误记录:
    • 它记录了内核在运行过程中的各种事件,如设备的连接和断开、驱动的加载和卸载等。同时,也会记录内核错误和警告信息。
    • 例如,如果某个设备驱动出现问题,可能会在dmesg中看到相应的错误代码和描述。这有助于系统管理员和开发者快速定位内核相关的问题。

日志基本信息

  • 日志路径:/var/log/dmesg
  • 日志格式: 文本格式
  • 查看方法:可以使用文本方式,也可以使用dmesg专用命令
1
[root@ilocalhost log]# dmesg  

总结

  • 其实一般没有硬件问题,这个日志是很少用到的。
  • 如果不加任何参数,则日志记录的时间是从开机启动的时间计算,如果要方便人类识别则加参数。 dmesg -T

kdump日志

在Linux基础-系统安装的时候,我们曾经在部署介绍说kdump功能,那什么是kdump呢?

kdump 是一个用于在 Linux 系统中进行内核崩溃转储的工具和机制。它允许系统在发生严重内核问题或崩溃时,捕获并保存内核转储文件(core
dump),以便后续分析和故障排除。

  • 主要功能和用途:
    • 捕获内核转储文件:kdump
      的主要功能是在系统遇到严重的内核问题、panic或崩溃时,能够捕获当前内核的状态并将其保存到预先配置的文件系统中。这些转储文件包含了导致崩溃的内核、内存和进程信息,有助于后续进行故障分析和修复。
    • 保护关键系统数据:当系统遇到崩溃时,常规的日志和调试工具可能无法正常工作。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 服务器架设
    • 鸟哥私房菜(全)
  • 微信公众号运维小路
  • 老男孩云计算

启示录

富贵岂由人,时会高志须酬。

能成功于千载者,必以近察远。


Linux基础
https://allendericdalexander.github.io/2025/03/05/linux_basic/
作者
AtLuoFu
发布于
2025年3月5日
许可协议