📢gitzw.com上线了,功能陆续更新中,如有问题或反馈请在下方反馈/建议中给我们留言。

Linux

服务器与开发绕不开的操作系统与命令行

L2 · 进阶
8教程
22知识库
24开源项目
6资讯
技术画像
🌐 官网🐙 GitHub
⭐ 推荐指数 ★★★★★
适合人群后端/运维工程师想吃透命令行的开发者
基本命令文件系统进程管理包管理网络配置Shell 脚本编写系统监控安全基础容器化简介虚拟化技术自动化工具备份与恢复故障排查高可用性配置

入门

基本命令

在学习 Linux 的过程中,掌握一些基本命令是必不可少的。通过本章的学习,你可以熟悉如何导航文件系统、创建和删除文件及目录,并进行简单的文本查看和编辑。

前置知识

你需要有一个可以访问的 Linux 终端环境。无论是本地安装的 Linux 发行版还是远程服务器,都可以用来练习这些命令。

常用基本命令详解

1. pwd

pwd 命令用于显示当前工作目录的完整路径。

pwd

预期结果:输出类似 /home/username 的路径。

2. ls

ls 命令列出指定目录中的文件和子目录。默认情况下会列出当前目录的内容。

ls

预期结果:显示当前目录下的所有文件和子目录列表。

如果你想看到隐藏文件(以.开头的文件),可以加上 -a 参数:

ls -a

3. cd

cd 命令用于更改当前工作目录。

cd /path/to/directory

例如,进入用户主目录:

cd ~

返回上一级目录:

cd ..

4. mkdir

mkdir 命令用于创建新目录。

mkdir new_directory_name

5. touch

touch 命令用于创建空文件或更新现有文件的时间戳。

touch new_file.txt

6. cp

cp 命令用于复制文件或目录。

cp source_file destination_file
cp -r source_directory destination_directory   # 复制整个目录及其内容时需加-r参数递归复制

7. mv

mv 命令用于移动或重命名文件和目录。

mv old_name new_name    # 重命名文件或目录
mv file_to_move /destination/path   # 移动文件到指定路径下 

8. rm

rm 命令用于删除文件或目录。删除操作不可逆,请谨慎使用!删除非空目录需要加上 -r 参数进行递归删除,并且通常会配合 -f 强制执行以跳过确认提示。

rm file_to_delete      # 删除单个文件  
rm -rf directory_to_remove     # 强制删除非空目录及其全部内容 

注意:使用 rm -rf * 将导致当前目录下所有内容被永久删除,极其危险!

9. cat

cat 命令用于显示文本文件的内容或将多个文本合并为一个新的文本。

cat filename.txt        # 显示filename.txt的内容   
cat file1.txt file2.txt > combined.txt    # 合并两个文本为combined.txt    

10. more, less

这两个命令都是分页显示长文本内容的工具。它们允许你在不一次性加载整个大文件的情况下浏览其内容。

  • more 只能向前滚动查看,按回车键向下翻一页,按空格键向后翻一页直到到达底部为止无法继续向下滚动更多内容了,则退出阅读模式回到shell提示符状态。
    more long_text_file.log     
  • less 相比more更加灵活支持双向滚动(即不仅能够像more那样向下看还可以向上看),并且提供了搜索功能,在其中输入“/”然后关键字即可查找相关内容出现匹配项后按n键查找下一个匹配位置或者N键查找前一个匹配位置;此外还有其他高级功能如高亮显示等在此不再赘述仅简单介绍常用之处供参考学习之用。
    less another_long_text_file.log     

11. head, tail

这两个命令分别用来查看文本开头部分以及结尾部分内容,默认情况下各显示前十行数据量较大时可通过增加-n参数来调整输出的具体行数以便快速预览日志或其他大型文档的部分区域而不是整体打开占用资源较多的情况发生。

  • head
    head logfile.log           # 查看logfile.log的第一十行内容      
    head -n 20 logfile.log     # 查看logfile.log的前二十行内容       
  • tail 实时监控日志增长动态变化情况非常适合调试程序排错过程中的即时跟踪输出信息变动情况使用-t选项可设置刷新间隔秒数自动刷新最新追加的数据块而无需手动反复执行该命令达到相同效果。另外-f选项则表示持续跟随输出直至进程终止或者用户主动中断程序运行才会停止监听追踪行为非常方便实用!
    tail logfile.log            # 默认查看logfile.log的最后一十行内容          
    tail -n 50 logfile.log      # 查看logfile.log的最后五十行内容           
    tail -f logfile.log         # 实时跟踪logfile.log的变化情况             

实战案例演示

假设我们要在一个名为project的新项目中创建几个必要的初始结构化组件比如源码存放区src、测试脚本test、构建产出dist以及文档doc等不同类型的资源分类管理便于后续开发维护工作的顺利开展:

首先确保我们在想要存放项目的根级别下启动终端窗口然后依次执行如下步骤:

  1. 创建顶层项目容器:

    mkdir project && cd project  
  2. 构建内部模块框架布局:

    mkdir src test dist doc   
  3. 初始化README.md作为项目说明文档模板:

    touch README.md   
    echo "# Project Title" >> README.md   
    echo "## Description" >> README.md   
    echo "This is a brief description of the project." >> README.md   
  4. 验证是否正确生成所需的各个部分结构:

    ls -l    

此时应当能看到四个子级子目录取README.md普通文本在内的五个条目排列整齐有序对应之前的操作成果展示无疑表明一切顺利完成了初步设定阶段的工作任务!

本章小结

  • 掌握了通过 pwd、ls 和 cd 来导航 Linux 文件系统的技能;
  • 学会了利用 mkdir 创建新目录的方法;
  • 理解了如何运用 touch 创建空白文档或是更新已有档案的时间属性;
  • 精通了 cp 和 mv 这两种重要的移动与复制操作手段;
  • 记住了 rm 是一个强大的但同时也极具风险性的清除对象利器务必小心谨慎地对待每一个删除动作以免造成不必要的损失;
  • 熟悉了 cat、more、less 对于查看各种大小文档的不同适用场合及优势所在;
  • 最后也见识到了 head 和 tail 在快速定位特定区域内容方面的高效便捷特性对于处理海量数据集尤其有用武之地。
参考来源:hackmd.io · zh.wikiversity.org

文件系统

在上一章中,我们学会了如何使用基本命令来导航和操作Linux文件系统。今天我们要深入了解一下Linux文件系统的内部机制,包括它的结构、原理以及一些常见的文件系统类型。通过本章的学习,你会对Linux是如何管理和存储文件有一个全面的认识。

首先需要明确的是,你需要已经安装好Linux系统,并且熟悉基本的命令行操作。

Linux文件系统概述

Linux中的万物皆是文件。无论是普通的文本文件、目录、硬件设备还是进程间通信的方式,在Linux看来都是文件。这种设计理念使得Linux的I/O操作非常一致和简单。

目录结构

Linux采用树状层次结构来组织文件和目录。根目录/是整个文件系统的起点。在这个根目录下,又有很多子目录,例如:

  • /bin/sbin:存放用户程序和服务启动所必需的基本二进制可执行程序。
  • /boot:存放启动加载程序和内核镜像。
  • /dev:包含设备节点。
  • /etc:存放配置文件。
  • /home:用户的主目录。
  • /lib/usr/lib:存放共享库和其他类型的库函数。
  • /mnt/media:挂载其他存储设备的地方。
  • /opt:用于存放第三方软件包。
  • /proc:虚拟文件系统,提供了访问内核状态信息的方法。
  • /root:超级用户的家目录。
  • /run:运行时变量数据。
  • /tmp:临时文件的存储位置。
  • /var:日志、邮件和其他变量数据的存储位置。

文件权限与属性

每个文件都有相应的权限设置,控制谁可以读取、写入或执行该文件。权限分为三类:

  1. 所有者(Owner) - 文件的所有者拥有对该文件的最大控制权,默认情况下创建的任何新文件的所有者是你自己。
  2. 组(Group) - 所有者所属的一个或多个组成员也可以访问此文件。
  3. 其他人(Others) - 系统上的其他用户也能访问此文件。

权限可以用符号表示法(如 rwxr-xr-x)或者八进制数字表示法(如 755)。其中 rwxr-xr-x 表示所有者有读、写、执行权限;组成员和其他人只有读和执行权限。

ls -l /etc/passwd

预期结果可能类似于 -rw-r--r-- 1 root root 1680 Jan 1 00:00 /etc/passwd

这里 -rw-r--r-- 表示权限设置为所有者可读写,而组和其他人都只能读取。

Inode与Data Block

Linux使用inode(索引节点)来保存关于每个文件的信息。每个inode包含指向实际数据块的指针以及其他元数据信息,如大小、时间戳等。当创建一个新文件时,会分配一个新的inode号,并为其分配一个或多个数据块来存储内容。

ll -di /

预期结果可能类似于 2 128 dr-xr-xr-x. 17 root root 4096 May 4 17:56 /

这里的 2 就是根目录对应的inode号。

常见的Linux文件系统类型

不同的应用场景可能需要用到不同类型的文件系统。以下是几种常见的Linux支持的文件系统:

文件系统类型 描述
ext4 最常用的日志式分区格式之一
XFS 支持大容量存储设备的大规模分布式计算环境
Btrfs 提供了快照功能的数据一致性检查等功能
NTFS Windows平台的主要分区格式

实际应用案例

假设你要在你的个人电脑上安装一个新的应用程序,并希望将其放在自定义的位置而不是默认路径下。你可以按照以下步骤进行:

  1. 创建一个名为 myapps 的新目录来存放应用程序:
    mkdir ~/myapps
  2. 下载并解压应用程序到这个新创建的目录中:
    wget http://example.com/myapp.tar.gz -P ~/myapps/
    tar -xzvf ~/myapps/myapp.tar.gz -C ~/myapps/
  3. 设置适当的权限以便能够运行该应用程序:
    chmod +x ~/myapps/myapp/bin/myapp_executable

这样你就成功地在一个非标准路径下安装了一个新的应用程序,并确保它可以正常运行。

常见问题与解决方法

如果你在上述过程中遇到了权限不足的问题,请尝试切换到root用户或者使用sudo命令提升权限:

sudo mkdir ~/myapps

如果下载的应用程序无法执行,请检查其是否有正确的可执行标志:

chmod +x path/to/executable_file

本章小结

  • 理解了“一切皆是文件”的设计理念及其带来的好处;
  • 掌握了如何查看和理解各种类型的权限设置;
  • 学习了inode与data block的概念以及它们在底层是如何协作工作的;
  • 对比了几种常见的Linux支持的分区格式,并知道何时选择哪种格式更为合适;
参考来源:kernel.org · github.com

进程管理

在Linux系统中,进程管理是一个核心功能,它决定了系统的响应速度和稳定性。通过合理地管理和监控进程,我们可以确保系统高效运行。本章将带你了解什么是进程,如何查看、控制和调整进程的状态及优先级。

前置知识

你需要熟悉基本的Linux命令行操作,比如使用ls, cd, 和pwd等命令来导航文件系统。此外,上一章中提到的基本权限管理也是必要的。

进程是什么?

进程可以简单理解为正在运行的程序实例。当你启动一个应用程序时,操作系统会为其创建一个进程。每个进程都有唯一的标识符——PID(Process ID)。例如,你可以通过以下命令查看当前正在运行的进程:

ps aux

这条命令会列出所有用户的进程及其详细信息,包括PID、用户、CPU使用率、内存使用率等。

查看进程的方法

除了ps aux之外,还有几个常用的命令可以帮助你查看和监控进程:

  • top: 实时显示系统中各个进程的资源占用情况。

    top

    使用top命令后,你会看到一个动态更新的界面,其中包含了CPU使用率最高和内存消耗最多的前几个进程的信息。

  • htop: 类似于top,但提供了更友好的交互界面。

    htop

    注意:默认情况下可能需要先安装htop

  • pidof: 根据名称查找指定程序的所有PID。

    pidof <process_name>

    比如你想找到名为sshd的服务对应的PID:

    pidof sshd

控制进程状态

启动新进程

大多数情况下,我们会在前台启动一个新进程。如果你想在后台启动一个新进程,在命令后面加上&符号即可:

sleep 100 &

这样sleeep命令就会在后台运行,并返回其PID。

将前台转后台

如果你已经有一个正在前台运行的进程,并希望将其转移到后台继续执行:

  1. 按下Ctrl+Z暂停该进程。
  2. 输入以下命令将其放到后台继续执行:
    bg %1 # 数字代表作业编号或PID号

杀死或停止进程

要结束一个不再需要的进程,可以使用kill命令发送信号给它。最常用的是TERM信号(默认),请求程序优雅地退出;如果程序不响应,则可以使用KILL信号强制终止:

kill -TERM <PID> # 请求优雅退出
kill -KILL <PID> # 强制终止过程(尽量少用)

例如杀死前面启动的那个sleeep背景任务:

kill $(pidof sleep)

调整优先级(Nice值)

Linux允许用户调整正在运行的每个进程的优先级(nice值)。数值越小表示优先级越高,默认值为0。普通用户只能增加nice值(降低优先级),只有root用户才能减少nice值提高优先级。

renice -n <new_nice_value> -p <PID>

比如把某个特定ID号为12345的任务调整到最低优先级(-20):

sudo renice -n -20 -p 12345 

注意:频繁更改nice值可能导致系统不稳定,请谨慎操作!

示例:优化Web服务器性能监控脚本

假设你在维护一台Web服务器,并发现某段时间内的CPU利用率异常高。首先我们需要找出占用CPU最多的那个罪魁祸首:

top 
# 或者使用htop获得更直观的效果: htop 

根据上面的结果定位到了具体的PID后进一步确认相关信息:

ps -p <PID> -o pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -n5 

如果确定是不必要的程序或者存在bug的部分代码,则采取相应措施处理;如果是正常业务需求导致的压力过大,则考虑升级硬件或优化代码逻辑。

本章小结

  • 理解了Linux中“进程”的概念及其重要性;
  • 掌握了如何利用多种工具查看和监控系统的实时状态;
  • 学会了如何正确地启动、停止以及调整进程中各元素的行为;
  • 认识到了合理安排和调度资源对于保证系统稳定性和效率的关键作用;
参考来源:github.com · cloud.tencent.com

核心概念

包管理

包管理是Linux系统中不可或缺的一部分,它帮助我们轻松地安装、升级和删除软件。通过本章的学习,你不仅能掌握常见的包管理工具,还能理解它们的工作原理,从而更好地进行系统管理和维护。

前置知识/环境

在继续之前,你需要有一个已经安装好Linux系统的计算机,并且最好有一定的命令行操作经验。我们主要介绍两个主流的包管理器:APT(用于Debian及基于Debian的系统如Ubuntu)和YUM/DNF(用于红帽系列的系统如CentOS/RHEL)。

APT 包管理器

APT是Advanced Package Tool的缩写,它是Debian及其衍生发行版中的默认包管理工具。以下是使用APT进行常见操作的方法:

安装软件包

要安装一个新的软件包,可以使用apt install命令。例如,如果你想安装vim编辑器:

sudo apt update  # 更新软件源列表
sudo apt install vim

执行上述命令后,APT会自动下载并安装vim及其依赖项。

升级软件包

为了确保你的系统是最新的,定期升级所有已安装的软件包是个好习惯:

sudo apt upgrade   # 只升级已安装的软件包到新版本而不添加或删除任何其他软件包
sudo apt full-upgrade  # 类似于upgrade,但可能会添加或删除一些软件包以满足依赖关系的变化

移除软件包

不再需要某个软件时,可以用apt remove来卸载它:

sudo apt remove vim     # 只移除vim本身
sudo apt purge vim      # 移除vim及其配置文件

搜索和显示信息

查找特定名称或描述包含关键词的软件包:

apt search vim    # 查找所有与vim相关的软件包

获取关于某个特定软件包的信息:

apt show vim      # 显示有关vim的信息,包括版本、大小、依赖等详细情况。

YUM 和 DNF 包管理器

YUM (Yellowdog Updater Modified) 是红帽系发行版的传统包管理工具。DNF (Dandified YUM) 是它的下一代替代品,并提供了更好的性能和功能改进。

安装、升级和移除软件包

使用 YUM:
sudo yum install vim        # 安装vim编辑器及其依赖项。
sudo yum update             # 升级所有已安装的软件包至最新版本。
sudo yum remove vim         # 移除vim编辑器。
使用 DNF:
sudo dnf install vim        # 安装vim编辑器及其依赖项。
sudo dnf upgrade            # 升级所有已安装的软件包至最新版本。
sudo dnf remove vim         # 移除vim编辑器。

搜索和显示信息

使用 YUM:
yum search vim              # 查找所有与vim相关的软件包。
yum info vim                # 显示有关vim的信息。
使用 DNF:
dnf search vim              # 查找所有与vim相关的软件包。
dnf info vim                # 显示有关vim的信息。

实际案例:部署一个简单的Web服务器

假设我们要在一个全新的Ubuntu服务器上快速搭建一个Apache Web服务器。我们可以按照以下步骤操作:

  1. 更新系统:
    sudo apt update && sudo apt upgrade -y  
  2. 安装Apache:
    sudo apt install apache2 -y   
  3. 检查服务状态:
    systemctl status apache2     
  4. 访问测试页面: 打开浏览器输入服务器IP地址,默认情况下应该能看到Apache欢迎页。

常见错误与排查技巧

  • 如果遇到权限问题,请确保使用sudo命令提升权限。
  • 当出现网络连接错误时,请检查网络设置或代理配置是否正确。
  • 对于未知错误信息,尝试使用搜索引擎查询相关解决方案或社区论坛求助。

本章小结

  • 理解了Linux中“包管理”的概念及其重要性;
  • 掌握了如何使用APT(YUM/DNF)进行基本的软件生命周期管理;
  • 学会了如何搜索和获取关于特定软件的信息;
  • 通过实际案例熟悉了整个部署流程;

网络配置

网络配置

在网络环境中,合理配置网络参数可以让Linux系统顺畅地与其他设备通信。本章将带你了解如何配置IP地址、子网掩码、网关等基本信息,并学会使用ifconfigip命令来管理和调试网络设置。

前置知识

在开始之前,你需要已经安装好Linux系统,并具备基本的Shell操作能力。此外,了解一些网络基础概念(如IP地址、子网掩码、网关等)会对你理解本章内容有所帮助。

基本概念

  • IP地址:用于标识网络中的设备,分为IPv4和IPv6两种格式。
  • 子网掩码:用于区分IP地址中的网络部分和主机部分。
  • 网关:作为通往其他网络的入口点,通常是路由器的IP地址。
  • DNS服务器:将域名解析为对应的IP地址。

使用 ifconfigip 命令

配置静态IP地址
使用 ifconfig

首先,我们需要找到系统的网卡名称。可以通过以下命令查看所有活动的网络接口:

ifconfig -a

假设我们的网卡名称是eth0,我们可以通过以下命令为其配置静态IP地址:

sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0 up
使用 ip

同样地,我们也可以使用更为现代的ip命令来完成同样的任务:

sudo ip addr add 192.168.1.100/24 dev eth0
sudo ip link set eth0 up

这两个命令分别设置了IP地址和启用了网卡。

设置默认路由

为了使系统能够访问外部网络,需要设置默认路由。以下是使用routeip route的方法:

使用 route
sudo route add default gw 192.168.1.1 eth0

这里的gw表示网关,后面的数字是你的默认网关地址。

使用 ip route
sudo ip route add default via 192.168.1.1 dev eth0
配置DNS服务器

为了让系统能够通过域名访问互联网资源,需要编辑DNS配置文件。打开或创建 /etc/resolv.conf 文件:

sudo nano /etc/resolv.conf

然后添加以下行以指定DNS服务器:

nameserver 8.8.8.8
nameserver 8.8.4.4

保存并退出编辑器后,新的DNS设置就会生效。

实际案例:配置一个简单的静态IP服务器

假设我们要将一台Ubuntu服务器的网络接口从动态分配改为静态分配,并确保它能够正常访问外部网络。

  1. 查找当前使用的网络接口:

    ip a s | grep '^[0-9]'

    假设输出中有 eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000, 则我们选择 eth0.

  2. 备份现有配置文件 (以防万一):

    sudo cp /etc/netplan/*.yaml /etc/netplan/backup.yaml.bak 
  3. 编辑Netplan配置文件 (路径可能因发行版不同而异):

    sudo nano /etc/netplan/50-cloud-init.yaml  
  4. 修改为静态IP配置, 内容如下:

    network:
      version: 2
      renderer: networkd
      ethernets:
        eth0:
          dhcp4: no # 关闭DHCPv4自动获取IP功能.
          addresses:
            - 192.168.1.2/24 # 静态分配一个私有局域网内的固定IP.
          gateway4: 192.168.1.1 # 设定默认路由(出口).
          nameservers:
            addresses:
              - 8.8.8.8 # Google公共DNS.
              - 8.8.4.4 # 另一个Google公共DNS备用选项.
  5. 应用新配置:

    sudo netplan apply  
  6. 验证更改是否成功:

    ip a show eth0  
    ping -c3 www.baidu.com # 尝试ping百度网站确认对外连通性良好.

易错提示与实用技巧

  • 如果遇到权限不足的问题,请确保使用了正确的管理员权限 (sudo) 来执行上述命令。
  • 修改后的NetworkManager或Netplan配置文件务必遵循正确的语法格式;否则可能导致无法启动网络服务。
  • 在生产环境中建议谨慎操作以防止中断业务连接;最好事先做好充分准备及备份原有配置。

本章小结

  • 掌握了如何使用 ifconfigip 命令进行基本的网络接口管理;
  • 学习了如何设置静态 IP 地址、默认路由以及 DNS 解析;
  • 理解了 Netplan 或 NetworkManager 如何处理复杂的网络配置需求;
  • 完成了从 DHCP 到静态 IP 的迁移实验并进行了有效性验证。

Shell 脚本编写

在 Linux 系统中,Shell 脚本是一种强大的工具,可以帮助我们自动化日常任务。通过编写 Shell 脚本,我们可以将多个命令组合在一起形成一个文件,从而简化复杂的操作流程。读完这一章后,你可以学会如何创建和运行简单的 Shell 脚本,并理解其中的基本概念。

前置知识

  • 你需要熟悉基本的 Linux 命令,比如 cdlsmkdir 等。
  • 了解如何编辑文本文件,推荐使用 nanovim

Shell 脚本的基础概念

什么是 Shell?

Shell 是一个提供命令行界面的程序,允许用户与操作系统进行交互。Bash(Bourne-Again SHell)是 Linux 上最常用的一种 shell。

什么是 Shell 脚本?

Shell 脚本是一系列命令的集合,存储在一个文件中。通过执行这个文件,可以一次性运行所有命令。这对于自动化任务特别有用。

创建第一个 Shell 脚本

  1. 打开终端

  2. 创建一个新的脚本文件

    nano myscript.sh
  3. 添加 Shebang 行: Shebang 行告诉系统使用哪个解释器来执行脚本。对于 Bash 脚本来说,通常是 #!/bin/bash

    #!/bin/bash
  4. 添加一些简单的命令

    echo "Hello, World!"
    date
  5. 保存并退出编辑器: 在 nano 中按 Ctrl+O 保存,然后按 Ctrl+X 退出。

  6. 赋予脚本执行权限

    chmod +x myscript.sh
  7. 运行脚本

    ./myscript.sh

    预期结果:

    Hello, World!
    Thu Oct 20 10:30:00 CST 2022

输入输出与变量

输出信息

使用 echo 命令可以在脚本中输出信息:

echo "This is a message"

变量

定义变量时不需要指定类型:

myvar="Hello, Variable!"
echo $myvar

用户输入

使用 read 命令获取用户输入:

echo "Enter your name:"
read username
echo "Hello, $username!"

控制流

条件判断

使用 if 语句进行条件判断:

if [ "$username" == "admin" ]; then
    echo "Welcome admin!"
else
    echo "Welcome guest."
fi

循环

for 循环

遍历一组值:

for i in {1..5}
do
   echo "Number: $i"
done
while 循环

基于条件反复执行:

count=1
while [ $count -le 5 ]
do
   echo "Count is: $count"
   ((count++))
done

示例:批量处理文件

假设我们要将 /tmp/ 目录下的所有 .txt 文件复制到 /home/user/docs/ 目录下,并重命名每个文件以包含日期戳。

  1. 创建目标目录(如果不存在):

    mkdir -p /home/user/docs/
  2. 编写脚本

    #!/bin/bash
    
    DATE=$(date +%Y%m%d)
    
    for file in /tmp/*.txt; do 
        if [ -f "$file" ]; then 
            cp "$file" "/home/user/docs/${DATE}_$(basename "$file")"
        fi 
    done
    
    echo "Files have been copied with new names."
  3. 赋予执行权限并运行脚本

    chmod +x copy_files.sh && ./copy_files.sh 

易错提示与实用技巧

  • 检查 shebang 是否正确:确保第一行是正确的 shebang (#!/bin/bash)。
  • 变量引用时注意引号:使用双引号包裹变量引用可以避免因空格或其他特殊字符导致的问题。
  • 调试脚本:使用 -xv 参数运行脚本来查看详细的执行过程。

本章小结

  • 学会了如何创建和运行简单的 Bash 脚本。
  • 掌握了如何在脚本中输出信息、定义和使用变量以及获取用户输入。
  • 理解了条件判断和循环控制的基本用法。
  • 实现了一个批量处理文件的例子,加深对实际应用场景的理解。
参考来源:freecodecamp.org · cnblogs.com

进阶能力

系统监控

系统监控是确保服务器稳定运行的关键步骤。通过监控系统的各项指标,我们可以及时发现潜在问题并采取措施解决,从而保证服务的连续性和可靠性。本章将详细介绍如何使用一些常用的Linux监控工具来实时查看和记录系统状态。

为了顺利进行本章的学习,你需要熟悉基本的Linux命令和Shell脚本编写。此外,确保你的系统已经安装了必要的软件包,并且你有足够的权限来执行监控命令。

常见系统监控工具

top

top 是一个实时显示系统进程信息的工具。它可以让你看到当前运行的所有进程及其占用的资源情况。

top

预期结果:你会看到一个不断刷新的界面,上面列出了所有正在运行的进程,包括它们各自的PID、用户、CPU使用率、内存使用率等信息。

htop

htoptop 的增强版,提供了更友好的交互界面和更多的功能选项。首先需要安装 htop

sudo apt-get install htop  # 对于Debian/Ubuntu系统
sudo yum install htop      # 对于CentOS/RHEL系统

安装完成后,你可以直接运行 htop 来查看系统状态:

htop

预期结果:你会看到一个颜色编码、易于阅读的界面,能够直观地看到各个进程的状态和资源占用情况。

free

free 命令用于显示系统的内存使用情况。

free -h

预期结果:你会看到内存总量、已用内存、空闲内存以及缓冲区/缓存使用的详细信息,并且数值是以人类可读的形式(如MB、GB)显示的。

df

df 命令用于报告文件系统的磁盘空间使用情况。

df -h

预期结果:你会得到一个表格形式的结果,列出每个挂载点对应的文件系统的总大小、已用空间、可用空间以及使用百分比。

iostat

iostat 可以用来监视系统的输入/输出存储设备负载情况。首先需要安装 sysstat 包:

sudo apt-get install sysstat  # 对于Debian/Ubuntu系统
sudo yum install sysstat      # 对于CentOS/RHEL系统

然后可以运行 iostat 查看I/O统计信息:

iostat -x 1 5  # 每秒刷新一次,共显示5次数据

预期结果:你会看到关于CPU利用率和各种设备I/O活动的数据报告。

使用 Monit 监控服务

Monit 是一个功能强大的监控工具,可以自动检测并修复常见的故障。以下是安装和配置 Monit 的简单步骤:

  1. 安装 Monit

    sudo apt-get install monit  # 对于Debian/Ubuntu系统
    sudo yum install epel-release && sudo yum install monit      # 对于CentOS/RHEL系统
  2. 编辑配置文件

    打开 /etc/monitrc 文件进行编辑:

    sudo nano /etc/monitrc
  3. 添加监控项

    在配置文件中添加你想要监控的服务或程序。例如,监控SSH服务是否正常运行:

    check process sshd with pidfile /var/run/sshd.pid
        start program = "/etc/init.d/ssh start"
        stop program = "/etc/init.d/ssh stop"
        if failed port 22 protocol ssh then restart
        if 5 restarts within 5 cycles then timeout
  4. 启动 Monit 并启用开机自启

    sudo systemctl enable monit && sudo systemctl start monit
  5. 访问 Web 界面

    默认情况下,Monit 提供了一个Web界面以便远程管理和查看状态。可以通过浏览器访问 http://your_server_ip:2812 来登录,默认用户名密码都是 admin 。请记得修改默认的安全设置以防止未经授权的访问。

实际案例:全面监控一台Web服务器

假设我们要监控一台提供Web服务的服务器。我们需要关注以下几个方面:

  • CPU 和 内存 使用率。
  • 磁盘空间 使用情况。
  • Nginx 和 MySQL 服务 的运行状况。
  • HTTP 请求量 和 错误日志 记录。

我们可以结合上述提到的各种工具来实现这个目标:

  1. 使用 htoptop 查看整体资源消耗。
  2. 使用 df -h 检查磁盘空间。
  3. 编写 Monit 配置文件来监控 Nginx 和 MySQL 的状态,并在出现问题时自动重启服务。
  4. 利用 Nginx 自带的日志分析工具或者第三方工具(如 GoAccess)来分析访问日志和错误日志。

易错提示与实用技巧

  • 定期检查日志文件:除了使用专门的日志分析工具外,定期手动查看关键服务的日志文件也是一个好习惯。
  • 设置合理的阈值报警:对于不同的指标(如CPU使用率),应该根据实际情况设定合适的报警阈值以避免不必要的干扰。
  • 备份配置文件:每次修改重要的配置文件后都应该做好备份以防万一出现意外情况需要恢复到之前的版本。

本章小结

  • 学习了几种常用的Linux命令行工具(如 top, htop, free, df, iostat)来进行实时性能监控。
  • 掌握了如何利用 Monit 工具实现对关键服务的自动化监控和管理。
  • 理解了全面监控一台Web服务器的重要性,并实践了一些具体的步骤和技术手段。
参考来源:github.com · time.geekbang.org

安全基础

在日常使用和运维过程中,确保系统的安全性至关重要。本章将带你了解如何识别和防范常见的安全威胁,并掌握一些基本的安全加固措施,让你的Linux系统更加健壮。

前置知识

  • 你需要熟悉基本的Linux命令行操作。
  • 对于文件权限和用户管理有一定的了解会有所帮助。

概念讲透

什么是安全漏洞?

安全漏洞是指存在于硬件、软件或协议中的缺陷,攻击者可以利用这些缺陷获取未经授权的访问权、执行恶意代码或破坏系统。常见的漏洞类型包括SQL注入、XSS(跨站脚本攻击)、缓冲区溢出等。

示例:SQL注入

假设有一个登录表单,后端处理如下:

SELECT * FROM users WHERE username = '$username' AND password = '$password';

如果用户输入的usernameadmin' --password为任意内容(例如xyz),那么查询就会变成:

SELECT * FROM users WHERE username = 'admin'; -- ' AND password = 'xyz';

这样攻击者就能绕过密码验证直接登录。

如何防范SQL注入?

  1. 使用预编译语句:避免直接拼接SQL字符串。
  2. 输入验证:对用户输入进行严格的校验和过滤。
  3. 最小权限原则:数据库用户仅拥有完成任务所需的最低权限。

实操步骤

修改默认账户和密码

为了防止未授权访问,默认账户(如root)应该立即更改密码,并考虑禁用root远程登录。

# 更改root密码
sudo passwd root

# 禁止root远程登录
sudo sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo systemctl restart sshd

配置防火墙规则

使用iptables或firewalld来限制不必要的网络流量。

# 安装firewalld(如果尚未安装)
sudo apt-get install firewalld

# 启动并启用firewalld服务
sudo systemctl start firewalld && sudo systemctl enable firewalld

# 添加允许SSH连接的规则(默认端口22)
sudo firewall-cmd --permanent --add-service=ssh

# 重新加载firewall配置以应用更改
sudo firewall-cmd --reload

监控认证日志

定期检查认证日志可以帮助发现异常登录行为。

tail -f /var/log/auth.log | grep "Failed"

易错提示与实用技巧

  • 定期更新系统:及时修补已知漏洞。
  • 备份重要数据:防止因安全事件导致的数据丢失。
  • 使用强密码策略:设置复杂的密码并定期更换。

小例子串起来

假设你是一名小型企业的IT管理员,你的服务器刚刚上线并且需要进行初步的安全配置。你可以按照以下步骤操作:

  1. 更改root密码并禁止root远程登录;
  2. 配置防火墙规则以仅允许必要的服务通过;
  3. 设置定时任务每天检查认证日志中的失败记录,并发送邮件通知你;
  4. 定期更新系统补丁并备份重要数据。

通过以上步骤,你可以大大降低服务器被攻破的风险。

本章小结

  • 学习了如何识别常见的安全漏洞及其危害。
  • 掌握了修改默认账户和密码的方法。
  • 熟悉了配置防火墙的基本步骤。
  • 理解了监控认证日志的重要性,并实践了一些具体的防护措施。
参考来源:201.ustclug.org · cnblogs.com

容器化简介

容器化是一种现代的应用部署方式,它通过将应用程序及其依赖打包在一个标准化的单元中来简化部署过程。读完本章后,你会理解什么是容器化以及如何使用它来提高开发和运维效率

为了更好地理解本章内容,你需要对基本的Linux命令和文件系统有一定的了解。

什么是容器?

容器是一组隔离的进程,它们共享同一个操作系统的内核,但彼此之间是相互隔离的。这意味着每个容器都有自己的文件系统、网络接口、进程空间等资源视图。相比于传统的虚拟机技术,容器更加轻量级,启动速度快,并且占用更少的系统资源。

为什么要使用容器?

  • 一致性:无论是在开发环境、测试环境还是生产环境中,容器都能保证应用的行为一致。
  • 快速部署:容器可以在几秒钟内启动和停止。
  • 高效利用资源:因为所有容器共享宿主机的操作系统内核,所以相比虚拟机来说更加高效。
  • 可移植性:容器可以很容易地在不同的环境中迁移和扩展。

Docker 是什么?

Docker 是目前最流行的开源容器平台之一。它提供了一整套工具来创建、管理和分发基于 Linux 的容器。Docker 使用镜像(image)作为构建块,镜像是一个包含应用及其所有依赖项的标准文件格式。

安装 Docker

首先我们需要安装 Docker。以下是基于 Ubuntu 系统的安装步骤:

  1. 更新包索引:

    sudo apt-get update
  2. 安装必要的包以允许 apt 通过 HTTPS 使用仓库:

    sudo apt-get install \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
  3. 添加 Docker 的官方 GPG 密钥:

    sudo mkdir -p /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  4. 设置稳定的存储库:

    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  5. 再次更新包索引并安装最新版本的 Docker Engine 和 containerd:

    sudo apt-get update
    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  6. 启动 Docker 并设置开机自启:

    sudo systemctl start docker
    sudo systemctl enable docker
  7. 测试 Docker 是否安装成功:

    sudo docker run hello-world

    如果一切正常,你应该会看到一条欢迎信息,表明 Docker 已经正确安装并且可以运行简单的镜像了。

创建第一个容器

接下来我们尝试创建一个简单的 Nginx 容器:

  1. 拉取最新的 Nginx 镜像:

    sudo docker pull nginx:latest
  2. 查看本地镜像列表确认是否已经下载完成:

    sudo docker images ls

    你应该能看到类似如下的输出:

    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx               latest              abcdefghijklm       2 weeks ago         133MB
  3. 运行 Nginx 容器并将主机的 8080 端口映射到容器内的 80 端口:

    sudo docker run --name mynginx -p 8080:80 -d nginx:latest
  4. 查看正在运行的容器列表确认 Nginx 正常运行:

    sudo docker ps 
  5. 打开浏览器访问 http://localhost:8080 ,你应该可以看到 Nginx 的默认欢迎页面。

常见问题与排查

  • 权限问题:如果执行 docker 命令时报错提示权限不足,请确保当前用户已被添加到 docker 用户组中。

    解决方法:

    sudo usermod -aG docker $USER && newgrp docker 
  • 端口冲突:如果指定的端口已经被其他程序占用,则无法启动新容器。

    解决方法:

    可以查看哪些程序占用了该端口:

    netstat -tuln | grep :<port>

然后选择更换端口号或者终止占用该端口的服务再重新尝试启动容器。

实用技巧

  • 使用 -v 参数挂载卷以便持久化数据。

例如:

sudo docker run --name myapp -v /path/on/host:/path/in/container <image_name>

这样即使删除了旧的容器也可以保留其中的数据。

小例子串起来

假设你是一名软件开发者,在本地开发了一个 Web 应用,并希望将其部署到云服务器上供其他人访问。你可以按照以下步骤操作:

  1. 编写一个简单的 Flask 应用来展示“Hello World”页面;
  2. 创建一个 Dockerfile 来定义如何构建应用镜像;
  3. 构建并推送这个镜像到公共或私有的 Docker Registry 上;
  4. 在云服务器上拉取这个镜像并通过适当的配置暴露给外部用户访问;
  5. 利用一些自动化工具(如 Kubernetes 或 Docker Compose)来实现负载均衡和高可用性部署。

通过上述流程不仅可以加快开发速度还能轻松应对流量高峰带来的挑战。

本章小结

  • 理解了什么是 Linux 容器及其优势。
  • 掌握了如何安装和配置 Docker。
  • 学习了如何创建并运行一个简单的 Nginx 容器。
  • 掌握了一些常用的 Docker 命令及实际应用场景中的注意事项。

虚拟化技术

虚拟化技术可以让我们在一台物理机上同时运行多个操作系统或应用程序实例,提高资源利用率和灵活性。读完本章后,你不仅能理解虚拟化的概念,还能学会如何在 Linux 上设置和管理虚拟机。

前置知识

为了更好地理解和实践本章内容,你需要对基本的 Linux 操作有一定的了解,特别是文件系统管理和进程管理的相关知识。

虚拟化技术概述

虚拟化是一种抽象层技术,它允许你在单个物理硬件平台上创建多个独立的操作系统环境。每个这样的环境被称为一个虚拟机(Virtual Machine, VM)。常见的虚拟化平台包括 VMware、VirtualBox 和 KVM(Kernel-based Virtual Machine)。

KVM 简介

KVM 是一种开源的内核模块,提供了硬件辅助的虚拟化能力。它是 Linux 内核的一部分,因此可以无缝地集成到现有的 Linux 系统中。KVM 主要用于服务器端虚拟化解决方案。

安装 KVM

首先我们需要确保你的 CPU 支持硬件虚拟化扩展(Intel VT-x 或 AMD-V)。可以通过以下命令检查:

egrep -c '(vmx|svm)' /proc/cpuinfo

如果返回值大于 0,则表示支持硬件虚拟化。

接下来安装必要的软件包:

sudo apt update && sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager -y

安装完成后需要将当前用户添加到 libvirtkvm 组:

sudo adduser $USER libvirt
sudo adduser $USER kvm

然后重新登录以使组权限生效。

创建和管理虚拟机

我们可以使用 virt-install 工具来创建新的虚拟机。下面是一个创建 Ubuntu 虚拟机的例子:

sudo virt-install \
--name ubuntu-vm \
--memory 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/ubuntu-vm.qcow2,size=20 \
--cdrom /home/user/Downloads/ubuntu.iso \
--network network=default,model=virtio \
--graphics none \
--console pty,target_type=serial \
--os-type linux \
--os-variant ubuntu20.04 \
--location 'http://archive.ubuntu.com/ubuntu/dists/focal/main/installer-amd64/'

这个命令会下载并安装 Ubuntu 20.04 的 ISO 镜像作为新 VM 的启动介质。请注意替换 /home/user/Downloads/ubuntu.iso 为你实际存放 ISO 文件的位置,并根据需要调整内存大小、CPU 数量和磁盘空间等参数。

使用图形界面管理 VMs

除了命令行工具外,你还可以使用 virt-manager 图形界面工具来管理你的虚拟机。只需在终端输入 virt-manager 即可启动该工具:

virt-manager &

在这个界面上你可以方便地查看所有已创建的 VM,并进行各种操作如启动、停止、重启以及修改配置等。

常见问题与排查技巧

  • 无法启动 VM 如果遇到无法启动的问题,请先检查日志文件以获取更多信息

    sudo virsh list --all # 查看所有 VM 的状态
    sudo journalctl -xeu libvirtd.service # 查看 libvirtd 日志
  • 网络连接问题 如果发现新创建的 VM 没有网络连接,请确认是否正确设置了桥接网络,并且主机上的防火墙规则允许相应的流量通过。

小例子串起来

假设你是一家小型公司的 IT 管理员,公司内部有一台高性能服务器用于日常办公任务。然而随着业务的增长,越来越多的应用程序和服务被部署在同一台机器上导致性能瓶颈日益严重。为了解决这个问题,你可以考虑使用 KVM 来实现服务器虚拟化。以下是具体步骤:

  1. 评估需求:确定需要运行哪些不同的服务或应用程序,并估算它们所需的资源(CPU、内存、存储)。
  2. 选择合适的 OS 映像:根据需求选择适合的服务操作系统映像(如 Ubuntu Server、CentOS 等)。
  3. 安装 KVM 及相关组件:按照前面介绍的方法在现有服务器上安装 KVM 并配置好相关的网络设置。
  4. 创建和配置 VMs:使用 virt-installvirt-manager 创建多个独立的 VM 实例,并为每个实例分配适当的资源。
  5. 监控和优化:定期监控各个 VM 的性能表现,并根据实际情况调整资源配置以达到最佳效果。

通过这种方式不仅能够有效地隔离不同应用之间的干扰,还能够在不增加额外硬件成本的前提下提升整体系统的稳定性和可靠性。

本章小结

  • 理解了什么是虚拟化技术和它的主要用途。
  • 学习了如何在 Linux 上安装和配置 KVM。
  • 掌握了如何使用命令行工具 virt-install 创建和管理虚拟机。
  • 提到了一些常见的故障排除方法以及实用技巧。
参考来源:en.wikipedia.org · linux.org

自动化工具

处理日常的系统维护和配置工作时,手动执行相同的操作会变得非常繁琐且容易出错。为了提高效率和减少人为错误,我们可以使用自动化工具来简化这些任务。今天我们要探讨的就是几种常用的Linux自动化工具,通过这些工具可以大大提升我们的工作效率。

前置知识

你需要对Shell脚本有一定的了解,因为大多数自动化工具都依赖于脚本来完成特定的任务。此外,熟悉基本的Linux命令也是必要的。

自动化工具概览

目前市面上有很多优秀的自动化工具,下面介绍几种广泛使用的:

工具名称 主要用途
Ansible 简单易用的配置管理和应用部署工具
Puppet 强大的配置管理解决方案
Cloud-init 用于初始化云实例的轻量级工具
Salt 支持远程执行、配置管理及软件分发的强大框架
Chef 使用Ruby作为DSL的语言进行基础设施自动化
Terraform 专注于基础设施即代码(IaC)的编排工具

Ansible

Ansible 是一种简单而强大的自动化工具,特别适合初学者。它不需要代理或者特殊的安全设置就可以运行,并且使用YAML格式来定义任务。

安装 Ansible

首先确保你的系统已经更新到最新状态:

sudo apt update && sudo apt upgrade -y

然后安装Ansible:

sudo apt install ansible -y

配置 Ansible Inventory

Inventory文件告诉Ansible你要管理哪些主机。默认情况下,这个文件位于 /etc/ansible/hosts。你可以编辑这个文件添加新的主机:

[webservers]
web1.example.com
web2.example.com

[dbservers]
db1.example.com

编写 Playbook

Playbook 是一组有序的任务列表,用来描述你希望如何配置目标主机的状态。例如创建一个简单的playbook来安装Apache:

---
- name: Install Apache Web Server
  hosts: webservers
  become: yes

  tasks:
    - name: Ensure Apache is installed and running on all web servers.
      apt:
        name: apache2
        state: present

    - name: Start and enable the Apache service.
      service:
        name: apache2
        state: started
        enabled: true

保存上述内容到 install_apache.yml 文件中。

执行 Playbook

使用以下命令来运行playbook:

ansible-playbook install_apache.yml

如果一切顺利,你会看到类似这样的输出信息表明任务成功执行。

Puppet

Puppet 是另一种功能强大的配置管理工具,它使用声明式的编程语言(称为Puppet DSL)来定义系统应该处于何种状态。

安装 Puppet Master 和 Agent

假设你想在一个节点上同时运行Master和Agent(通常不推荐生产环境中这样做),可以按照如下步骤操作:

安装 Puppet Master:
wget https://apt.puppetlabs.com/puppet-release-bionic.deb # 根据你的发行版替换bionic为相应的代号如focal,xenial等。
sudo dpkg -i puppet-release-bionic.deb 
sudo apt-get update 
sudo apt-get install puppetserver -y 
启动并启用 Puppet Master 服务:
sudo systemctl start puppetserver 
sudo systemctl enable puppetserver 
安装 Puppet Agent:
wget https://apt.puppetlabs.com/puppet-release-bionic.deb # 根据你的发行版替换bionic为相应的代号如focal,xenial等。
sudo dpkg -i puppet-release-bionic.deb  
sudo apt-get update  
sudo apt-get install puppet-agent -y   
启动并启用 Puppet Agent 服务:
sudo systemctl start puppet  
sudo systemctl enable puppet    
将Agent注册到Master:

编辑 /etc/puppetlabs/puppet/puppet.conf 文件,在 [main] 部分添加master地址:

[master]
dns_alt_names = puppet,puppet.example.com 

[agent]
server = master.example.com  
environment = production  
runinterval = 1h  

重启Puppet Agent以应用更改:

sudo systemctl restart puppet   

现在你的Puppet环境已经搭建好了,可以通过编写Manifests来进行进一步的配置管理了。

实际应用场景举例:批量部署Web服务器集群

假设我们需要快速地在多个服务器上部署一套Nginx服务,并确保所有服务器上的Nginx版本一致、配置也完全相同。我们可以利用Ansible轻松实现这一点。

首先确保所有的目标服务器已经在inventory文件中列出,并且可以从控制节点SSH登录无需密码验证(可通过ssh-keygen生成密钥对并通过ssh-copy-id复制公钥至各目标节点实现免密登录)。接着编写一个playbook:

---
- name: Deploy Nginx Web Servers Cluster  
  hosts: webservers  
  become: yes  

  tasks:
    - name: Install Nginx package on all web servers.     
      apt:
        name: nginx     
        state: latest   

    - name: Copy custom Nginx configuration file to each server.       
      copy:
        src: files/nginx.conf      
        dest: /etc/nginx/nginx.conf      
        owner: root        
        group: root        
        mode: '0644'       

    - name: Restart Nginx after config change.          
      service:
        name: nginx         
        state: restarted      

这里我们在tasks部分分别指定了三个动作:安装nginx包、拷贝自定义配置文件以及重启nginx服务以使新配置生效。将上述内容保存为deploy_nginx_cluster.yml后即可通过下述命令一键完成整个集群的部署过程:

ansible-playbook deploy_nginx_cluster.yml   

这样无论有多少台web服务器都需要加入该集群,只需将其IP地址添加进inventory文件并在同一目录下存放好对应的nginx.conf模板文件即可自动完成统一部署工作。

本章小结

  • 我们介绍了几种常用的Linux自动化工具及其适用场景。
  • 学习了如何安装和基本使用Ansible进行批量任务处理。
  • 对比了Puppet与其他同类产品的差异之处,并演示了其核心概念——Manifests。
  • 最后结合实际案例展示了如何利用这些自动化手段高效地完成复杂的工作流。
参考来源:51cto.com · zhuanlan.zhihu.com

部署运维

备份与恢复

备份与恢复是运维工作中不可或缺的一部分,它能确保我们的数据在意外情况下不会丢失。通过学习本章,你将掌握如何对Linux系统进行有效的备份和恢复操作。

前置知识

在开始之前,你需要熟悉基本的Linux命令和文件系统操作,因为这些技能会贯穿在整个备份与恢复的过程中。

文件备份和恢复

文件备份是最常见的备份形式。我们可以使用多种工具来实现这一点,其中最常用的是tar命令。

使用 tar 命令进行文件备份

假设我们要备份 /home/user/data 目录到 /backup 目录下,可以使用以下命令:

tar -czvf /backup/data_backup.tar.gz /home/user/data
  • -c 创建新的归档文件
  • -z 使用gzip压缩
  • -v 显示详细信息
  • -f 指定归档文件名

执行后你会看到类似这样的输出:

/home/user/data/
/home/user/data/file1.txt
/home/user/data/file2.txt
...

使用 tar 命令进行文件恢复

当我们需要从备份中恢复数据时,可以使用以下命令:

tar -xzvf /backup/data_backup.tar.gz -C /restore_dir/
  • -x 解压归档文件
  • -C 指定解压路径

执行后 /restore_dir/ 将包含所有从归档中提取出来的文件。

镜像备份和恢复

除了文件级别的备份外,还可以对整个磁盘或分区进行镜像级别的备份。这通常用于系统级别的完整复制。这里介绍 dd 命令的使用方法。

使用 dd 命令进行镜像备份

如果我们想创建一个硬盘的完整镜像,可以使用 dd 命令:

sudo dd if=/dev/sda of=/path/to/image.img bs=4M status=progress && sync
  • if= 输入文件(源)
  • of= 输出文件(目标)
  • bs= 设置块大小以提高效率

这个过程可能需要较长时间,并且会占用大量空间,请确保有足够的存储空间。

使用 dd 命令进行镜像恢复

当需要从镜像还原硬盘时,同样使用 dd 命令:

sudo dd if=/path/to/image.img of=/dev/sdb bs=4M status=progress && sync

注意这里的 /dev/sdb 是你要写入的目标设备,请谨慎选择以免误覆盖其他重要数据。

实际案例:系统迁移与灾难恢复演练

假设我们需要将一台运行中的Web服务器迁移到另一台机器上。以下是具体步骤:

  1. 停止服务:首先关闭所有正在运行的服务以保证一致性。

    sudo systemctl stop httpd mysql redis 
  2. 创建全量快照:使用 tar 对关键目录如 /etc, /var/www/html, /var/lib/mysql, 和 /opt/redis-data 进行打包。

    sudo tar -czvf system_snapshot.tar.gz /etc /var/www/html /var/lib/mysql /opt/redis-data 
  3. 传输快照:将生成的快照传输到新服务器。

    scp system_snapshot.tar.gz user@new_server:/tmp/
  4. 准备新服务器:在新服务器上安装必要的软件和服务。

    sudo yum install httpd mysql-server redis-server -y  
  5. 解压快照:登录到新服务器并解压快照。

    sudo tar -xzvf /tmp/system_snapshot.tar.gz -C /
  6. 启动服务:最后启动所有相关服务。

    sudo systemctl start httpd mysql redis  

以上就是一个简单的系统迁移流程,在实际操作中还需要考虑更多的细节比如防火墙规则、SELinux策略等调整。

本章小结

  • 掌握了如何使用 tardd 命令进行文件和磁盘级别的备份及恢复。
  • 学习了在实际场景中应用这些技术的方法论。
  • 注意到了在执行高风险操作前务必做好充分的数据验证工作以防万一出现问题导致数据丢失。
参考来源:cnblogs.com · blog.csdn.net

故障排查

在日常使用 Linux 系统过程中,难免会遇到各种各样的问题,比如系统启动失败、服务无法启动、性能瓶颈等等。本章将教你如何通过一系列步骤来诊断和解决问题,让你能够快速定位并修复这些问题。

前置知识

  • 基础命令(如 cat, grep, tail
  • 文件系统知识
  • 进程管理(如 ps, top

故障排查的基本步骤

1. 确定问题范围

首先,明确问题的具体表现。例如,系统是否能正常启动?某个服务是否可以访问?或者系统性能是否有明显下降?

2. 查看日志文件

日志文件是排查故障的重要线索。不同的问题对应不同的日志文件。

a. 启动日志

如果系统启动有问题,可以从 /var/log/boot.log/var/log/messages 查找相关信息

sudo cat /var/log/boot.log | grep -i "error"

预期结果:显示启动过程中出现的所有错误信息。

b. 应用程序日志

应用程序的日志通常位于 /var/log/ 目录下。例如 Apache 的日志在 /var/log/httpd/

sudo tail -f /var/log/httpd/error_log

预期结果:实时查看最新的错误日志条目。

c. 安全日志

安全相关的事件记录在 /var/log/secure/var/log/auth.log

sudo cat /var/log/secure | grep -i "failed"

预期结果:列出所有认证失败的尝试。

3. 使用调试工具

有时候需要更深入地分析程序的行为,这时可以使用一些调试工具。

a. strace

用于跟踪系统调用和信号传递。

strace -e openat -f ./your_app 2>&1 | grep -i "No such file"

预期结果:显示应用程序尝试打开哪些文件以及是否存在未找到的文件。

b. top/iostat/vmstat/free/top/netstat/ss/iotop/etc.

这些命令可以帮助你监控系统的整体性能。

top # 实时查看 CPU 和内存使用情况
iostat # 显示 CPU 利用率和设备 I/O 统计信息
vmstat 1 # 每秒报告虚拟内存统计信息
free -h # 显示内存使用情况,并以人类可读的方式呈现数据大小单位(MB/G)
netstat -anp | grep ESTABLISHED # 显示已建立的网络连接及其对应的进程 ID 和端口号(旧版)
ss -anp state established # 新版替代方案,功能更强且速度更快地展示已建立的连接及关联进程信息(推荐使用)
iotop # 实时查看每个进程的磁盘 I/O 使用情况(需 root 权限)

4. 使用 Live CD 进入救援模式修复 GRUB 引导加载程序的问题

如果 GRUB 配置文件损坏或被清空导致系统无法引导,可以使用 Live CD 启动进入救援模式进行修复。

# 挂载根分区至 /mnt 目录下:
mount /dev/sda1 /mnt

# 安装 GRUB 至指定磁盘:
grub2-install --root-directory=/mnt /dev/sda

# 更新 GRUB 配置文件:
grub2-mkconfig -o /boot/grub2/grub.cfg

# 卸载挂载点:
umount /mnt && reboot now # 卸载后重启系统完成修复操作。

实战案例:解决 MySQL 数据库无法启动的问题

假设你的 MySQL 数据库突然无法启动了,按照上述步骤逐一排查:

  1. 确定问题范围

    sudo systemctl status mysqld.service # 查询 MySQL 服务的状态信息以确认其当前运行状况。
  2. 查看日志文件

    sudo tail -f /var/log/mysqld.log # 实时追踪 MySQL 错误日志以寻找潜在的原因。
  3. 检查配置文件

    sudo cat /etc/my.cnf | grep datadir # 确认数据库的数据存储路径是否正确无误。
  4. 重启服务

    sudo systemctl restart mysqld.service # 尝试重新启动 MySQL 服务看看是否能恢复正常工作状态。
  5. 进一步诊断 如果仍然无法启动,则可能涉及到权限设置、存储空间不足等问题。此时可以通过以下命令进行检查:

    df -h /data/mysql_data_dir_path_here/ ; ls -lZd /data/mysql_data_dir_path_here/
  6. 处理特殊情形 若遇到权限相关的问题,请确保数据目录属于正确的用户组,并赋予适当的权限:

    chown -R mysql:mysql /data/mysql_data_dir_path_here/
    chmod 750 /data/mysql_data_dir_path_here/

常见报错与排查技巧

  • Kernel Panic: 出现内核崩溃的情况时,应该立即保存现场并通过分析核心转储(core dump)来找出根本原因。可以通过修改内核参数启用核心转储功能,并配置相应的存储位置以便后续分析。

  • Filesystem Error: 当检测到文件系统错误时,建议及时执行 fsck 工具对磁盘进行全面扫描与修复。对于某些关键分区而言,在执行此操作之前务必备份重要数据以防万一造成永久性损失。

  • Service Failures: 对于那些频繁宕机的服务组件来说,除了关注常规的日志记录外还可以借助 systemd-journalctl 工具获取更加详细的后台消息流辅助诊断过程中的每一个环节。

本章小结

  • 掌握了如何通过查看不同类型的日志文件来识别和理解系统的异常行为;
  • 学会利用调试工具如 strace 来深入探究程序内部的操作细节;
  • 能够运用 Live CD 解决 GRUB 引导加载器失效带来的困扰;
  • 在面对复杂故障时具备了一套逐步缩小排查范围直至最终解决问题的能力体系;
参考来源:cnblogs.com · aliyun.com

实战

高可用性配置

高可用性配置是确保系统在各种故障情况下仍能正常运行的关键。通过合理配置,我们可以最大限度地减少停机时间和数据丢失的风险。本章将介绍如何在Linux中搭建一个基本的高可用性集群,主要使用Pacemaker和Corosync这两个核心组件。

为了顺利进行高可用性配置,你需要熟悉Linux的基本命令、网络配置以及Shell脚本编写等内容。此外,还需要至少两台服务器来进行集群部署。

高可用性概念

高可用性的目标是尽量减少系统的停机时间,提高服务的稳定性和可靠性。这意味着即使某个节点出现问题,整个系统仍然可以继续提供服务。常见的高可用性架构包括主备模式和负载均衡模式。

环境准备

首先,我们需要准备两台或多台服务器作为集群节点,并确保它们之间的网络连接正常。假设我们有两台服务器:node1 和 node2。

安装必要的软件包

# 在所有节点上安装 Pacemaker 和 Corosync
sudo apt-get update
sudo apt-get install pacemaker corosync pcs fence-agents-all

启动并启用相关服务

# 启动并启用 Corosync 和 Pacemaker 服务
sudo systemctl start corosync
sudo systemctl enable corosync
sudo systemctl start pacemaker
sudo systemctl enable pacemaker

配置防火墙规则

确保防火墙允许集群通信所需的端口:

# 打开必要的端口
sudo ufw allow 5404/tcp # Corosync 群集流量
sudo ufw allow 5405/tcp # Corosync 成员投票流量
sudo ufw allow 2224/tcp # PCSD Web UI 访问

创建集群

设置密码认证

为了安全起见,需要为PCSD(Pacemaker Cluster System Daemon)设置密码:

# 设置 PCSD 密码(在每个节点上执行)
sudo passwd hacluster

加入集群

选择其中一个节点作为初始节点,并将其加入到集群中:

# 在 node1 上创建集群(替换 your_cluster_name 为你想要的集群名称)
sudo pcs cluster auth node1 node2 -u hacluster --force

# 初始化集群(仅在 node1 上执行一次)
sudo pcs cluster setup --name your_cluster_name node1 node2 --start --enable --force

# 检查集群状态(可以在任意节点上执行)
sudo crm status

添加资源和服务

一旦集群建立完成,就可以添加资源和服务来测试其高可用性特性。例如,我们可以添加一个简单的HTTP服务来验证集群的功能。

安装Apache HTTP Server

# 在所有节点上安装 Apache HTTP Server
sudo apt-get install apache2 -y

配置共享存储(可选)

如果需要共享存储来存放Web内容,则需额外配置LVM、GFS2或OCFS2等文件系统。

添加虚拟IP地址资源

# 添加一个虚拟 IP 地址 (VIP)
sudo pcs resource create VirtualIP ocf:heartbeat:IPaddr2 ip=192.168.1.100 cidr_netmask=24 op monitor interval=30s on-fail=restart meta migration-threshold=3 failure-timeout=60s resource-stickiness=100 inet_addr_same_subnet=false nic="eth0"

添加Apache服务资源

# 添加 Apache HTTP Server 资源,并使其依赖于 VIP 资源启动顺序正确无误。
sudo pcs resource create WebServer ocf:heartbeat:apache configfile="/etc/apache2/apache2.conf" statusurl="http://localhost/server-status" op monitor interval=30s on-fail=restart meta migration-threshold=3 failure-timeout=60s resource-stickiness=100 colocation inf: WebServer VirtualIP order start VirtualIP then start WebServer order stop WebServer then stop VirtualIP 

实际场景示例:双机热备Web服务器

假设我们有一个小型企业网站托管在上述搭建的双机热备环境中。当一台服务器出现故障时,另一台服务器会自动接管网站服务以保障业务连续性。

常见报错与排查技巧

  • 权限问题:确保hacluster用户具有足够的权限来管理Pacemaker和Corosync。
  • 网络问题:检查各节点间的网络连通性是否良好。
  • 资源配置错误:仔细检查资源配置语法及依赖关系是否正确无误。
  • 日志分析:使用crm statusjournalctl -xe查看详细日志信息以定位问题所在之处。

本章小结

  • 掌握了如何通过Pacemaker和Corosync构建基本的Linux高可用性集群;
  • 学会了如何配置虚拟IP地址和其他关键资源以支持高可用性的需求;
  • 能够根据实际应用场景调整资源配置策略;
  • 在遇到常见问题时具备初步排查能力;
参考来源:cnblogs.com · cnblogs.com