标签: Linux

  • Ubuntu24.04在本地搭建 Kubernetes 开发环境:Docker、Minikube 和 kubectl 安装与配置指南

    如何在本地环境中通过 Docker、Minikube 和 kubectl 构建一个 Kubernetes 集群。Kubernetes 是目前主流的容器编排平台,而 Minikube 提供了一个轻量级的本地集群环境,方便开发者和学习者进行实验和测试。

    1. 安装 Docker

    首先,您需要在系统中安装 Docker。运行以下命令以下载并安装 Docker:

    # 安装 Docker
    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh

    安装完成后,将普通用户添加到 docker 用户组中,以便无需使用 sudo 来运行 Docker 命令:

    # 配置普通用户加入到 docker 用户组
    sudo usermod -aG docker $USER

    执行以上命令后,您需要退出并重新登录才能使更改生效。

    2. 安装 Minikube

    Minikube 是用于在本地启动 Kubernetes 集群的工具。运行以下命令以安装 Minikube:

    curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
    sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64
    
    minikube version

    3. 安装 kubectl

    1. 更新系统软件包列表,并安装必要的依赖:
    sudo apt-get update
    sudo apt-get install -y apt-transport-https ca-certificates curl gnupg
    1. 添加 Kubernetes 的 APT 仓库 GPG 密钥:
    curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    sudo chmod 644 /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    1. 配置 Kubernetes APT 仓库源:
    echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
    sudo chmod 644 /etc/apt/sources.list.d/kubernetes.list
    1. 更新软件包列表并安装 kubectl
    sudo apt-get update
    sudo apt-get install -y kubectl

    4. 启动 Minikube

    安装完成后,启动 Minikube 集群:

    minikube start --driver=docker

    5. 验证安装

    使用以下命令检查 Minikube 和 kubectl 的状态:

    minikube status
    kubectl get nodes

    如果输出显示集群状态正常,Minikube 已成功启动。

    6. 常用 kubectl 命令

    • 查看所有命名空间中的所有 Pod:
    kubectl get pods --all-namespaces
    • 查看默认命名空间中的所有 Pod:
    kubectl get pods
    • 查看服务:
    kubectl get services
    • 查看集群节点:
    kubectl get nodes
    • 查看所有 Deployments:
    kubectl get deployments
    • 查看资源使用情况(如节点的 CPU、内存等):
    kubectl top nodes
    • 删除一个 Pod:
    kubectl delete pod <pod-name>
    • 启动一个新的 Pod(如运行一个 nginx 容器):
    kubectl run nginx --image=nginx

    7. 访问 Kubernetes Dashboard(可选)

    如果您想进行可视化管理,可以访问 Kubernetes Dashboard:

    minikube dashboard

    8. 测试 Nginx 部署

    1. 创建一个 Nginx 部署:
    kubectl create deployment nginx --image=nginx
    1. 将 Nginx 部署暴露到集群外部:
    kubectl expose pod nginx --type=NodePort --name=nginx-service --port=80
    1. 查看服务的端口分配:
    kubectl get services
    1. 获取 Minikube 的 IP 地址:
    minikube ip
    1. 使用浏览器测试 Nginx 服务:
    curl http://<IP>:<端口>

    9. 临时暴露端口供其他人访问,使用 kubectl port-forward 访问 Nginx

    1. 确保 Nginx Pod 正在运行:
    kubectl create deployment nginx --image=nginx
    1. 查找 Nginx Pod 的名称:
    kubectl get pods -l app=nginx
    1. 使用 kubectl port-forward 进行端口转发:
    kubectl port-forward --address 0.0.0.0 <pod-name> <host-port>:<container-port>

    例如,将本地的 8080 端口转发到 Nginx 容器的 80 端口:

    kubectl port-forward --address 0.0.0.0 nginx-5869d7778c-qdfr2 8080:80
    1. 保持终端窗口打开。
    2. 从外部访问 Nginx:
    http://<IP>:8080

    10. 注意事项

    • kubectl port-forward 端口转发是临时的,关闭终端窗口时会断开连接。
    • 使用 --address 0.0.0.0 将服务暴露到所有网络接口,确保在公共网络中谨慎使用。
    • Pod 故障时,需要重新执行端口转发命令。
  • tcpdump 在网络运维和网络安全场景下的使用

    tcpdump 是一个强大的命令行数据包分析工具,常用于网络运维和网络安全领域。它允许你捕获并检查网络流量,帮助诊断问题、识别潜在的安全威胁以及进行性能分析。

    • 数据包 (Packet): 网络传输的基本单位,包含源地址、目标地址、协议类型等信息。
    • 抓包 (Packet Capture): 使用工具(如 tcpdump)捕获并存储网络流量的数据包。
    • 过滤 (Filtering): 指定要捕获的数据包的条件,只捕获符合条件的流量,减少数据量和分析工作量。

    1. 网络运维场景

    • 故障排除:
      • 连接问题: 诊断网络连接失败的原因,例如无法访问远程服务器、服务中断等。通过捕获连接建立(三次握手)过程中的数据包,可以判断是客户端、服务器端还是网络中间环节的问题。
      • 性能问题: 分析网络延迟、丢包等性能问题。通过观察数据包的往返时间、序列号和确认号,可以判断是否存在网络拥塞、设备故障等。
      • 路由问题: 跟踪数据包的传输路径,验证路由配置是否正确。
      • DNS 问题: 检查 DNS 查询和响应过程,诊断域名解析失败的原因。
      • DHCP 问题: 监控 DHCP 发现、提供、请求和确认过程,排查 IP 地址分配问题。
    • 网络监控:
      • 流量分析: 捕获特定协议、端口或主机的数据包,分析网络流量模式和带宽使用情况。
      • 服务验证: 验证网络服务的可用性和正确性,例如 Web 服务、邮件服务等。
      • 协议分析: 深入了解各种网络协议的工作原理,例如 TCP、UDP、ICMP、HTTP 等。

    2. 网络安全场景

    • 入侵检测:
      • 异常流量识别: 捕获可疑的网络流量,例如端口扫描、恶意代码传播、未经授权的访问等。
      • 攻击行为分析: 分析攻击者利用的协议和技术,例如 SYN Flood 攻击、DDoS 攻击、SQL 注入等。
      • 后门检测: 发现潜在的后门程序或恶意连接。
    • 安全审计:
      • 网络活动记录: 捕获关键的网络通信数据,用于安全事件的调查和审计。
      • 策略合规性检查: 验证网络安全策略的实施情况,例如防火墙规则、访问控制列表等。
    • 漏洞分析:
      • 协议漏洞利用: 分析网络协议的实现细节,发现潜在的漏洞。
      • 渗透测试: 在渗透测试过程中捕获网络流量,验证安全漏洞的可利用性。
    • 恶意软件分析:
      • C&C 通信分析: 捕获恶意软件与控制服务器之间的通信数据,了解恶意软件的行为和目的。
      • 数据泄露分析: 监控网络流量,发现敏感数据的泄露行为。

    案例:

    案例 1: 诊断 Web 服务器响应缓慢

    场景: 用户报告访问你的 Web 服务器 (IP 地址: 192.168.1.10, 监听端口 80443) 时页面加载缓慢。你需要分析网络层面是否存在瓶颈。

    说明: 在 Web 服务器上捕获与客户端的 TCP 流量,观察 TCP 交互过程、包的大小、延迟等,判断是网络延迟、丢包还是服务器处理慢。

    命令 (在 Web 服务器上执行):

    sudo tcpdump -i eth0 tcp and port 80 or port 443 -s 1500 -v -x -XX -ttt -w web_slow.pcap

    说明:

    • sudo: 以管理员权限运行。
    • -i eth0: 指定监听的网络接口。
    • tcp and port 80 or port 443: 仅捕获 TCP 协议且源或目标端口为 80 或 443 的数据包 (HTTP/HTTPS)。
    • -s 1500: 设置抓包时每个数据包捕获的最大长度为 1500 字节,确保捕获完整的 TCP/IP 头部和大部分应用层数据。
    • -v: 输出更详细的信息 (verbose),例如 TTL、标识、序列号等。
    • -x: 以十六进制格式显示每个数据包的内容。
    • -XX: 以十六进制和 ASCII 格式显示每个数据包的内容,方便查看应用层数据。
    • -ttt: 显示更详细的时间戳,包含日期和微秒级精度,有助于精确计算延迟。
    • -w web_slow.pcap: 将捕获的数据包保存到 web_slow.pcap 文件,方便后续使用 Wireshark 等图形化工具进行分析。

    分析 (使用 Wireshark 或 tcpdump -r web_slow.pcap):

    1. 观察 TCP 三次握手: 确认连接建立是否正常,是否存在延迟。
    2. 分析 TCP 窗口大小和流量控制: 观察窗口大小是否过小导致数据传输受限。
    3. 检查重传 (Retransmissions) 和重复确认 (Duplicate ACKs): 这可能表明存在丢包或网络拥塞。
    4. 分析数据包大小和传输速率: 是否存在大量小包导致 overhead 过高,或者传输速率过慢。
    5. 使用 Wireshark 的 “Follow TCP Stream” 功能: 查看完整的 HTTP 请求和响应,分析响应时间。
    6. 计算 Round-Trip Time (RTT): 观察数据包发送和确认之间的时间差,判断网络延迟。

    案例 2: 排查内部服务间的通信故障

    场景: 内部应用 A (IP: 10.0.1.10, 端口 9000) 无法连接到内部应用 B (IP: 10.0.1.20, 端口 9001)。你需要诊断网络层面是否存在问题。

    说明: 在应用 A 和应用 B 所在的服务器上分别捕获这两个 IP 和端口之间的 TCP 流量,观察连接尝试和响应情况。

    命令 (在应用 A 的服务器上执行):

    sudo tcpdump -i eth0 tcp and host 10.0.1.10 and host 10.0.1.20 and port 9000 and port 9001 -v -n

    命令 (在应用 B 的服务器上执行):

    sudo tcpdump -i eth0 tcp and host 10.0.1.10 and host 10.0.1.20 and port 9000 and port 9001 -v -n

    说明:

    • -n: 不进行主机名和端口名解析,直接显示 IP 地址和端口号,更清晰。
    • 其他参数与案例 1 类似,但这里没有保存到文件,可以直接在终端观察。

    分析 (在终端观察或使用 Wireshark 分析保存的文件):

    1. 在应用 A 的服务器上: 是否看到 SYN 包发送到 10.0.1.20:9001
    2. 在应用 B 的服务器上: 是否收到来自 10.0.1.10:9000 的 SYN 包?
    3. 如果应用 B 收到了 SYN 但没有回复 SYN-ACK: 可能是应用 B 服务未运行、防火墙阻止了入站连接。
    4. 如果应用 A 发送了 SYN 但没有收到 SYN-ACK: 可能是网络中间设备阻止了连接、应用 B 服务未运行或防火墙阻止了出站连接。
    5. 观察 RST (Reset) 包: 如果看到 RST 包,表示连接被强制关闭,需要进一步分析原因。

    案例 3: 分析潜在的 SQL 注入攻击

    场景: 你的 Web 服务器 (IP: 192.168.1.10, 端口 80) 接收到可疑的 HTTP 请求,你怀疑可能存在 SQL 注入攻击。

    说明: 捕获与 Web 服务器的 HTTP 流量,并分析 POST 请求的内容,查找可能包含恶意 SQL 语句的特征。

    命令 (在 Web 服务器上执行):

    sudo tcpdump -i eth0 tcp and port 80 -s 200 -A | grep -E 'SELECT.*FROM|INSERT.*INTO|UPDATE.*SET|DELETE.*FROM|UNION.*SELECT'

    说明:

    • -s 200: 捕获每个数据包的前 200 字节,通常足以包含 HTTP 请求头部和部分 POST 数据。
    • -A: 以 ASCII 格式显示数据包内容。
    • grep -E '...': 使用正则表达式过滤包含常见 SQL 关键字的 HTTP 请求内容。

    分析 (查看 grep 的输出):

    1. 检查匹配到的行: 是否在 HTTP POST 请求的数据中看到类似 SELECT * FROM users WHERE username='evil' OR 1=1;INSERT INTO ... VALUES ... 等可疑的 SQL 语句?
    2. 分析请求的 URI 和参数: 是否有异常的参数名或参数值?
    3. 结合 Web 服务器日志: 关联分析该请求发生时的服务器行为和错误信息。

    更精细的过滤可以使用 tshark (Wireshark 的命令行工具) 进行更复杂的 HTTP 内容过滤。

    案例 4: 检测和分析恶意软件的 DNS 查询行为

    场景: 你怀疑内部某台主机 (IP: 192.168.1.50) 可能感染了恶意软件,它可能尝试解析恶意的域名进行 C2 通信或下载恶意载荷。

    说明: 捕获该主机发送的 DNS 查询请求,并分析查询的域名是否属于已知的恶意域名列表或具有异常特征。

    命令 (在网络边界防火墙或内部 DNS 服务器上执行):

    sudo tcpdump -i eth0 udp and port 53 and src host 192.168.1.50 -vv -n | grep -E '.(ru|cn|top|xyz)$'

    说明:

    • udp and port 53: 仅捕获 UDP 协议的 DNS 流量。
    • src host 192.168.1.50: 仅捕获源 IP 为可疑主机的 DNS 查询。
    • -vv: 输出更详细的 DNS 查询信息。
    • -n: 不进行主机名解析。
    • grep -E '.(ru|cn|top|xyz)$': 使用正则表达式过滤查询的域名是否以某些常见的恶意域名后缀结尾 (这只是一个示例,需要根据实际威胁情报更新)。

    分析 (查看 grep 的输出):

    1. 检查匹配到的域名: 是否包含已知的恶意域名或具有可疑特征 (例如,随机字符组成的子域名)?
    2. 分析查询频率: 是否在短时间内发送了大量不同的 DNS 查询?
    3. 结合威胁情报: 将捕获到的域名与已知的恶意域名列表进行比对。

    案例 5: 调查 DDoS 攻击的源头

    场景: 你的 Web 服务器 (IP: 192.168.1.10) 遭受 DDoS 攻击,你需要捕获攻击流量并分析攻击源和攻击类型。

    说明: 在 Web 服务器的入口网关或服务器自身捕获流量,分析源 IP 地址、协议类型、目标端口等特征。

    命令 (在 Web 服务器或入口网关上执行):

    sudo tcpdump -i eth0 -n -nn dst host 192.168.1.10 -c 10000 | awk '{print $1}' | sort | uniq -c | sort -nr | head -20

    说明:

    • dst host 192.168.1.10: 仅捕获目标 IP 为 Web 服务器的流量。
    • -c 10000: 捕获 10000 个数据包 (根据实际情况调整)。
    • awk '{print $1}': 提取源 IP 地址。
    • sort: 对源 IP 地址进行排序。
    • uniq -c: 统计每个源 IP 地址出现的次数。
    • sort -nr: 按出现次数降序排序。
    • head -20: 显示出现次数最多的前 20 个源 IP 地址。

    分析 (查看 head 的输出):

    1. 识别攻击源: 出现次数最多的源 IP 地址很可能是攻击源。
    2. 分析攻击类型:
    • 大量 SYN 包: 可能是 SYN Flood 攻击。使用 tcpdump -i eth0 -n -nn dst host 192.168.1.10 and tcp[13] == 2 -c 100 分析。
    • 大量 GET/POST 请求: 可能是 HTTP Flood 攻击。使用 sudo tcpdump -i eth0 -n -nn dst host 192.168.1.10 and tcp port 80 -A -c 100 分析 HTTP 内容。
    • 大量 UDP 包: 可能是 UDP Flood 攻击。使用 sudo tcpdump -i eth0 -n -nn dst host 192.168.1.10 and udp -c 100 分析。
    • 源 IP 地址是否分散: 分布式 DDoS 攻击的源 IP 地址会比较分散。

  • Linux 文件系统选择指南:EXT4、XFS、Btrfs

    选择合适的文件系统是设置 Linux 系统时的关键决策。此选择显著影响性能、稳定性、数据完整性和可用功能。在最流行的选项中,EXT4、XFS 和 Btrfs 各自提供了一组独特的优势和劣势。

    EXT4:稳定可靠的主力

    EXT4 是最成熟和广泛采用的 Linux 文件系统,通过广泛的测试和实际使用赢得了其稳定性和可靠性的声誉。作为 EXT3 的继承者,它保留了向后兼容性,同时引入了性能和可扩展性的显著改进。

    优点:

    • 坚如磐石的稳定性和成熟度: 其悠久的历史和广泛的使用使其成为任何 Linux 环境中极其稳定和可靠的选择。
    • 均衡的性能: EXT4 提供适用于各种工作负载的良好整体性能,尤其擅长处理较小的文件和资源适中的系统。
    • 出色的兼容性: 作为许多主要 Linux 发行版的默认文件系统,确保了与现有工具和内核版本的无缝集成和兼容性。
    • 强大的日志功能: 日志功能通过记录文件系统更改来保证数据完整性,最大限度地降低意外系统中断后数据损坏的风险。
    • 向后兼容性: EXT4 可以无缝挂载较旧的 EXT3 和 EXT2 文件系统,简化了迁移。
    • 大容量支持: 它可以处理高达 1 EB 的卷和高达 16 TB 的单个文件,满足大量的存储需求。
    • SSD 优化 (TRIM): 支持 TRIM 命令可优化固态硬盘的性能并延长其使用寿命。

    缺点:

    • 有限的高级功能: 与较新的文件系统相比,EXT4 缺乏内置的高级功能,例如快照和本机数据完整性校验和。
    • 极端工作负载下的可扩展性限制: 虽然能够处理较大的容量,但在极大的文件系统和高要求的计算场景中,其扩展效率可能不如 XFS。
    • 没有本机加密: 加密通常使用 dm-crypt 等工具在较低层次进行管理。
    • SSD 上潜在的写入放大: 日志记录过程可能会增加固态硬盘上的写入操作,从而可能缩短其使用寿命,尽管 TRIM 有助于缓解此问题。

    最佳使用场景(扩展):

    • 标准桌面和笔记本电脑系统: 其性能、稳定性和兼容性的平衡使其成为日常计算任务、软件开发、网络浏览和一般生产力的绝佳选择。
    • 引导分区: 由于其成熟度和广泛支持,EXT4 通常是 /boot 分区的默认和推荐文件系统,确保可靠的系统启动。
    • 通用服务器: 对于没有极端 I/O 需求或大量文件的 Web 服务器、应用程序服务器和文件服务器,EXT4 提供了一个坚实可靠的基础。
    • 中小型数据库: 对于不处理极大对象或不需要非常高事务率的数据库,EXT4 可以提供良好的性能和稳定性。
    • 虚拟机主机(用于访客镜像): 在存储虚拟机磁盘映像时,EXT4 提供了一个稳定且易于理解的环境。
    • 外部硬盘和 USB 驱动器: 其广泛的兼容性使其成为可能在不同 Linux 系统上使用的便携式存储设备的安全选择。
    • 嵌入式系统: 在资源受限且稳定性和低开销非常重要的环境中,EXT4 可能是一个合适的选择。

    XFS:适用于大数据的可扩展强者

    XFS 由 Silicon Graphics (SGI) 开发,是一种高性能的 64 位日志文件系统,专为可扩展性和高效处理大型文件和海量数据集而设计。

    优点:

    • 卓越的可扩展性: XFS 擅长管理非常大的文件系统,可有效扩展到 EB 级别 的存储,并在高负载下保持性能。
    • 针对大型文件进行了优化: 在处理大型连续文件时提供卓越的读写性能,使其非常适合媒体服务器、数据仓库和高性能计算环境。
    • 高效的空间分配: 采用基于区段的分配方式,最大限度地减少碎片并提高性能,尤其对于大型连续数据块。
    • 可靠的日志功能: XFS 包含强大的日志功能,以确保数据一致性并促进系统故障后的快速恢复。
    • 在线碎片整理: 能够 在文件系统挂载并积极使用时对其进行碎片整理,最大限度地减少停机时间。
    • 动态分配: XFS 根据需要高效地分配存储空间。
    • 在线分区扩展: 允许在不卸载的情况下无缝调整分区大小。

    缺点:

    • 无法缩小分区: 一旦创建了 XFS 分区,就无法减小其大小,因此在初始设置期间需要仔细规划。
    • 缺乏本机校验和: XFS 不包含数据和元数据的内置数据完整性校验和,与 Btrfs 等文件系统相比,可能会增加静默数据损坏的风险。
    • 延迟分配风险: 虽然通常可以提高性能,但在突然断电且数据尚未物理写入磁盘的情况下,延迟分配策略可能会导致数据丢失。
    • 强制数据日志记录: 虽然对传统硬盘有利,但强制数据日志记录可能会增加固态硬盘的写入周期,从而可能缩短其使用寿命。

    最佳使用场景(扩展):

    • 大型媒体服务器: 由于其在处理大型连续数据方面的出色性能,非常适合存储和流式传输大型视频和音频文件。
    • 视频编辑和制作工作站: 大型文件的快速读/写速度对于处理原始视频素材和项目文件至关重要。
    • 高性能计算 (HPC): 适用于管理科学模拟和研究中生成和处理的大量数据集。
    • 大型数据库: 对于具有非常大的表和高 I/O 吞吐量要求的数据库,XFS 可以提供显著的性能优势。
    • 日志文件服务器: 有效处理来自多个源的大型日志文件的持续写入。
    • 软件构建服务器: 在处理大型代码库和众多中间文件时,可以缩短构建时间。
    • 大型文件归档: 非常适合存储和管理大量大型文件集合。
    • 备份服务器(用于大型备份): 有效处理完整系统备份中常见的大型顺序写入。

    Btrfs:具有高级功能的现代文件系统

    Btrfs 是一种现代的写时复制 (CoW) 文件系统,旨在解决传统 Linux 文件系统的许多限制。它包含快照、子卷、内置 RAID 和数据完整性检查等高级功能。

    优点:

    • 尖端功能: Btrfs 提供了一系列丰富的高级功能,包括快照、用于灵活分区的子卷、本机 RAID(0、1、10 和实验性的 5/6)、数据压缩和在线碎片整理。
    • 增强的数据完整性: 它采用数据和元数据的校验和来检测,并且在某些 RAID 配置中,自动修复数据损坏。
    • 写时复制 (CoW) 架构: 这种基本设计原则提高了可靠性并实现了高效的快照和数据重复数据删除。
    • 节省空间的快照: 创建只读或读写快照可以轻松进行备份和系统回滚。
    • 灵活的子卷: 子卷提供了一种在单个物理文件系统中创建逻辑分区的机制。
    • 动态 inode 分配: Btrfs 可以高效地处理大量文件。
    • 在线调整大小: 支持在线扩展,以及虽然有时不太可靠,但可以缩小文件系统。
    • 数据重复数据删除: 可以识别并消除重复的数据块,从而节省宝贵的存储空间。

    缺点:

    • 历史稳定性问题: 虽然已显著改进,但在某些复杂配置中,特别 是对于 RAID 5 和 6 的实现,Btrfs 在历史上一直存在稳定性问题,一些人仍然认为这是实验性的。
    • 性能开销: CoW 机制有时会导致更高的 CPU 和内存使用率,并且对于非常大的顺序写入,写入性能可能比 XFS 慢。由于 CoW,随着时间的推移,碎片化也可能变得更加明显。
    • 增加的复杂性: 大量的高级功能使得 Btrfs 的管理和故障排除比 EXT4 或 XFS 更复杂。
    • SSD 上潜在的写入放大: 尽管支持 TRIM,但固有的 CoW 特性可能会导致固态硬盘上更高的写入放大。

    最佳使用场景(扩展):

    • 需要轻松回滚的工作站和笔记本电脑: 快照允许用户在安装软件或更改配置后轻松恢复到以前的系统状态。
    • 家庭服务器和 NAS 设备: 内置的 RAID 支持(RAID 0、1、10 和实验性的 5/6)和数据完整性功能使其对数据保护很有吸引力。
    • 利用快照的虚拟机主机: 虚拟机映像的快照允许快速回滚到以前的状态,有助于测试和开发。
    • 容器存储: 子卷可以有效地用于管理 Docker 和其他容器化平台的存储。
    • 开发和测试环境: 快照对于创建一致且易于恢复的测试环境非常宝贵。
    • 受益于数据压缩的系统: 内置压缩可以节省磁盘空间,尤其对于可压缩的文件类型。
    • 类似单盘 RAID 的配置(RAID 1 用于元数据/数据): 即使在单个磁盘上,对元数据(以及可选的数据)使用 RAID 1 也可以提高数据完整性。
    • Arch Linux 和 openSUSE 系统(默认): 这些发行版已将 Btrfs 作为其默认设置,表明其适用于广泛希望使用其高级功能的 用户。

    选择正确的文件系统:总结

    功能EXT4XFSBtrfs
    稳定性出色良好良好(RAID 5/6 实验性)
    性能全面良好,更适合小文件大型文件性能出色尚可,大型写入可能较慢
    可扩展性良好大型文件系统性能出色良好
    数据完整性日志日志数据和元数据校验和,自我修复
    快照无本机支持无本机支持内置
    子卷
    RAID 支持无本机支持无本机支持内置(RAID 0, 1, 10, 5, 6)
    压缩无本机支持无本机支持内置
    在线调整大小仅扩展仅扩展扩展和缩小(缩小可能不太可靠)
    碎片整理随着时间推移可能发生由于区段分配,不太容易发生由于 CoW 可能成为问题
    SSD 优化TRIM 支持TRIM 支持,强制数据日志记录TRIM 支持,可能存在写入放大
    复杂性简单中等复杂
    默认选择许多发行版通常用于服务器一些现代发行版

    结论:

    最佳的文件系统选择取决于您的具体需求和优先级。

    • 对于通用计算,稳定性和易用性至关重要,EXT4 仍然是一个可靠且经过充分测试的选项。
    • 对于处理大型文件并需要高吞吐量和可扩展性的苛刻服务器环境,XFS 提供了出色的性能。
    • 如果您优先考虑快照、数据完整性检查和内置 RAID 等高级功能,Btrfs 提供了一个强大而现代的解决方案,但需要在复杂性和历史稳定性方面做出权衡。

    考虑您的工作负载、数据完整性的重要性、对高级功能的需求以及您管理可能更复杂的文件系统的舒适程度。如果可能,在非生产环境 中测试不同的文件系统可以为 其性能和适用性提供有价值的见解。最终,了解每个文件系统的优势和劣势将使您能够做出明智的决定,并为您的 Linux 系统构建坚实的基础。

  • Vim配置优化提升编辑体验

    Vim 是一个非常强大的文本编辑器,凭借其灵活的配置和强大的插件系统,能够适应各种需求。通过一些简单的配置,您可以显著提升 Vim 的使用体验。以下是一些常见且实用的配置,帮助您让 Vim 更加高效和便捷。

    1. 设置文件编码为 UTF-8
      让 Vim 支持多种字符,避免乱码。
    set encoding=utf-8
    1. 设置终端编码为 UTF-8
      确保终端和 Vim 的字符编码一致,避免乱码。
    set termencoding=utf-8
    1. 显示行号
      在编辑代码时,显示行号方便定位。
    set number
    1. 开启语法高亮
      让代码更易读,通过颜色区分不同的语法元素。
    syntax on
    1. 显示光标位置
      在底部显示光标的行列位置,方便查看。
    set ruler
  • Linux使用su成为root用户的几种方式

    在 Linux 系统中使用 su 命令获取 root (超级用户) 权限的几种主要方式

    使用 su 成为 root 的几种方式:

    1. su: 这是最基本的形式。当不带任何用户名执行 su 时,它默认切换到 root 用户。系统会提示您输入 root 密码。成功输入密码后,您将获得一个 root shell。您的环境变量通常会从之前的用户那里保留下来。
    $ su
    Password:
    #
    1. su -su - root: 这个命令会切换到 root 用户,并且还会加载 root 用户的环境变量。这意味着您将拥有与直接以 root 用户身份登录时相同的环境变量、工作目录(通常是 /root)和 shell 配置。这通常是完全获得 root 身份的推荐方式。
    $ su -
    Password:
    #
    1. su root: 这与第一个选项 (su) 等效。它明确指定目标用户为 root
    $ su root
    Password:
    #
    1. su -c <命令>su root -c <命令>: 这允许您以 root 身份执行单个命令,而无需获得 root shell。命令执行完毕后,您将返回到原始用户。系统会提示您输入 root 密码
    $ su -c "useradd newuser"
    Password:
    $
  • 使用 Immich CLI 上传照片和视频

    要求

    在使用 Immich CLI 之前,请确保您的环境满足以下条件:

    • Node.js 20 或更高版本
    • npm(Node.js 包管理器)

    安装 Immich CLI

    全局安装

    使用 npm 进行全局安装 Immich CLI:

    npm i -g @immich/cli

    卸载旧版本

    如果您之前安装过旧版 CLI,建议先卸载以避免冲突:

    npm uninstall -g immich

    快速入门

    在使用 Immich CLI 之前,您需要先进行身份验证,并连接到您的 Immich 服务器。

    1. 认证登录

    您需要使用 API 密钥向 Immich 服务器进行身份验证。
    执行以下命令,将 [服务器地址][API 密钥] 替换为实际值:

    immich login [服务器地址] [API 密钥]

    示例:

    immich login http://192.168.1.216:2283/api HFEJ38DNSDUEG

    认证成功后:

    • CLI 会自动将您的凭据存储在 auth.yml 配置文件中。
    • 默认情况下,该文件位于 ~/.config/ 目录下。
    • 如果需要自定义存储目录,可以使用 -d 选项或 IMMICH_CONFIG_DIR 环境变量。

    安全提示:

    • 为确保账户安全,在使用完 CLI 后,建议执行 immich logout 注销,或手动删除 auth.yml 文件。

    2. 上传文件到 Immich 服务器

    上传单个或多个文件

    如果要上传单个文件或多个文件,可以直接指定文件路径:

    immich upload file1.jpg file2.jpg

    上传整个目录(默认不包含子文件夹)

    如果要上传目录中的所有文件(不包括子目录),可执行:

    immich upload directory/

    上传包含子文件夹的目录

    如果目录中包含多个子文件夹,并希望上传所有内容,请使用 --recursive 选项:

    immich upload --recursive directory/

    3. 预览上传内容

    如果不确定哪些文件会被上传,或者希望在执行前进行确认,可以使用 --dry-run 选项进行模拟运行:

    immich upload --dry-run --recursive directory/

    此命令不会实际上传文件,只会显示哪些文件将被上传。

    4. 提高上传性能

    跳过哈希计算

    默认情况下,Immich 在上传文件前会计算哈希值,以避免重复上传。
    如果您确定文件是唯一的,并希望加快上传速度,可以使用 --skip-hash 选项跳过哈希计算:

    immich upload --skip-hash --recursive directory/

    注意

    • Immich 服务器仍会进行哈希处理以执行重复数据删除,因此这个选项仅影响客户端性能。
    • 如果您的带宽充足,跳过哈希计算可以加快上传速度。

    5. 自动管理相册

    Immich CLI 支持自动创建相册,并根据文件夹名称或自定义名称进行管理。

    根据文件夹名称自动创建相册

    使用 --album 选项,Immich 会根据文件夹名称自动创建相册,并将对应文件上传到相册中:

    immich upload --album --recursive directory/

    上传文件到指定相册

    如果希望将所有文件上传到一个特定相册,可以使用 --album-name 选项:

    immich upload --album-name "My Summer Holiday" --recursive directory/

    6. 过滤上传文件

    有时,您可能需要跳过某些文件或目录,Immich 提供了 --ignore 选项来实现文件过滤。

    跳过特定文件或文件夹

    例如,如果您想跳过 Raw 文件夹下的所有内容,可以执行:

    immich upload --ignore **/Raw/** --recursive directory/

    排除多个文件类型

    可以使用多个 --ignore 规则,匹配不同的文件类型,例如排除 .tif 文件:

    immich upload --ignore **/Raw/** **/*.tif --recursive directory/

    7. 包含隐藏文件

    默认情况下,Immich 不会上传隐藏文件(文件名以 . 开头)。
    如果希望上传隐藏文件,可以使用 --include-hidden 选项:

    immich upload --include-hidden --recursive directory/

    获取 API 密钥

    使用 Immich CLI 之前,您需要一个 API 密钥,该密钥可以在 Web 界面的 用户设置面板 中获取。

    获取 API 密钥的步骤:

    1. 进入 Immich Web 管理界面
    2. 用户设置 页面中找到 API Key 选项
    3. 生成新的 API 密钥并复制,用于 CLI 登录