标签: Linux

  • SSH 报错REMOTE HOST IDENTIFICATION HAS CHANGED解决方法

    一、问题背景

    重装服务器系统再次连接 SSH 连接时,会出现如下报错:

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
    Host key verification failed.

    提示信息中可能还会包含:

    Offending ECDSA key in /Users/username/.ssh/known_hosts:26
    Host key for 192.168.XXX.XXX has changed

    二、为什么会发生

    SSH 通过 主机密钥(Host Key) 验证服务器身份:

    1. 第一次连接服务器时,SSH 会保存服务器的公钥指纹到本地:
    2. 后续连接时,会对比服务器发来的指纹与本地保存的指纹。
    3. 如果指纹不一致,SSH 会拒绝连接,防止中间人攻击。
    • 重装系统时,服务器会重新生成新的 SSH 主机密钥。
    • 因此,旧的指纹与新的不匹配。
    • SSH 就会报“REMOTE HOST IDENTIFICATION HAS CHANGED”。

    三、解决方法

    在本地终端执行:

    ssh-keygen -R <服务器IP>
    ssh root@<服务器IP>

    首次连接会提示:

    Are you sure you want to continue connecting (yes/no)?

    输入:

    yes
  • Debian 13 配置第二块网卡并设置默认路由优先级

    在服务器或虚拟机环境中,服务器需要使用 双网卡结构,例如:

    • 一张卡走业务网络
    • 一张卡走管理网络
    • 或者一张主用,一张备用

    一、确认网卡是否识别

    执行:

    ip a

    如果看到类似:

    ens33:
    ens37:

    说明第二块网卡已经被系统正常识别。

    二、配置第二块网卡

    编辑网络配置文件:

    nano /etc/network/interfaces

    完整配置如下:

    # The primary network interface
    allow-hotplug ens33
    iface ens33 inet dhcp
        metric 100
    # The second network interface
    auto ens37
    iface ens37 dhcp
        metric 300

    三、什么是 metric

    在 Linux 中:

    metric 越小,优先级越高

    例如:

    metric含义
    0最高优先级
    100
    300
    1000+极低

    四、重启网络使配置生效

    systemctl restart networking

    五、验证默认路由是否正确

    查看路由表:

    ip route

    正常应显示:

    default via 172.16.1.1 dev ens37 metric 100
    default via 172.17.1.1 dev ens33 metric 300

    验证真实出口:

    ip route get 8.8.8.8

    如果看到:

    dev ens33

    所有默认流量已经从主网卡 ens33 出口走

  • 使用 Docker 一键部署本地 WordPress 开发环境

    下面是一份适合完全新手的 WordPress 本地安装教程(使用 Docker Desktop + docker compose)

    1. 为什么选择 Docker 部署 WordPress?

    对于初学者来说,Docker 就像是一个“虚拟打包盒”。它将 WordPress 运行所需的所有组件(数据库、PHP、Web服务器等)打包在隔离的环境中运行,完全不干扰你的电脑主机系统。

    主要优势对比:传统环境 vs. Docker 容器

    特性传统安装 Docker 容器化部署
    环境配置需手动安装和配置 PHP、MySQL、Nginx/Apache,易出现版本冲突和依赖错误。仅需一个配置文件 (docker-compose.yml),环境自动搭建,保证一次成功。
    系统侵入安装组件会修改操作系统配置,可能与其他软件冲突。环境完全隔离,零侵入主机系统,不产生任何“数字垃圾”。
    可移植性难以将环境从一台电脑迁移到另一台,或从本地迁移到云服务器。极高的可移植性。只需复制项目文件夹,即可在任何支持 Docker 的机器上一键还原
    启动/停止需要分别启动和关闭 Web 服务、数据库服务等多个进程。使用 docker compose up -ddown 命令,一键管理所有服务。

    简而言之,Docker 是现代本地开发的首选方案。它帮你彻底告别环境配置的噩梦,让你将所有精力集中在 WordPress 本身,实现真正的即开即用。

    2. 安装 Docker Desktop 与创建独立项目目录

    2.1 安装 Docker Desktop (核心工具)

    访问 Docker 官方网站下载并安装适用于您操作系统的版本:

    https://www.docker.com/products/docker-desktop/

    安装完成后,请打开 Docker Desktop 应用程序,并确保左下角的状态显示为 Running(正在运行)。

    2.2 创建项目工作目录

    在您喜欢的位置(如桌面或文档文件夹),创建一个新的空文件夹,作为您的 WordPress 项目目录。所有配置文件和数据都将保存在这里。

    wordpress-docker

    3. 核心配置:编写 docker-compose.yml 文件

    进入 wordpress-docker 文件夹,新建一个名为 docker-compose.yml 的文件。

    把下面内容完整粘贴进去:

    services:
    
      db:
        image: mysql:8.0
        restart: always
        environment:
          MYSQL_DATABASE: wordpress
          MYSQL_USER: wordpress
          MYSQL_PASSWORD: wordpress
          MYSQL_ROOT_PASSWORD: qixinlee.com
        volumes:
          - ./mysql:/var/lib/mysql
        networks:
          - wordpress_network
    
      wordpress:
        image: wordpress:latest
        restart: always
        ports:
          - "80:80"
        environment:
          WORDPRESS_DB_HOST: db
          WORDPRESS_DB_USER: wordpress
          WORDPRESS_DB_PASSWORD: wordpress
          WORDPRESS_DB_NAME: wordpress
        volumes:
          - ./web:/var/www/html
          - ./logs:/var/log/apache2  
        networks:
          - wordpress_network
    
      phpmyadmin:
        image: phpmyadmin:latest
        restart: always
        ports:
          - "8080:80"
        environment:
          PMA_HOST: db
        networks:
          - wordpress_network
    
    networks:
      wordpress_network:

    保存文件即可。

    4. 执行部署:启动容器并验证服务状态

    这是最关键的一步,我们将通过终端命令启动 WordPress 环境。

    4.1 打开终端并导航到项目目录

    首先,根据您的操作系统,打开相应的终端工具:

    系统终端工具
    WindowsPowerShell / CMD
    Mac / LinuxTerminal

    如何确定路径?

    您需要告诉终端工具您的项目文件夹 wordpress-docker 位于电脑的哪个位置。

    1. 找到项目位置: 找到您在 步骤 2 中创建的 wordpress-docker 文件夹。
    2. 复制完整路径:
    • Windows 用户: 在文件管理器中,点击地址栏并复制完整的路径(例如 C:\Users\YourName\Desktop\wordpress-docker)。
    • Mac / Linux 用户: 右键点击文件夹,选择“获取信息”或“属性”,然后复制路径。

    执行导航(cd 命令):

    使用 cd (Change Directory) 命令进入该文件夹。请将下面的示例路径替换为您自己电脑上的实际路径(YourName 也要替换)。

    • 如果您的文件夹在 Windows 桌面:
    cd C:\Users\YourName\Desktop\wordpress-docker
    • 如果您的文件夹在 Mac/Linux 桌面:
    cd /Users/YourName/Desktop/wordpress-docker

    成功进入文件夹后,您就可以进行下一步的启动操作了。

    4.2 执行启动命令

    运行以下命令来启动所有服务。-d 参数表示在后台(分离模式)运行容器:

    docker compose up -d

    提示: 第一次运行会自动下载 WordPress、MySQL 和 phpMyAdmin 的镜像文件——请耐心等待下载和创建过程完成。

    4.3 验证服务状态

    启动完成后,运行以下命令检查容器状态:

    docker compose ps

    如果看到以下三个服务都显示为 running,则表示部署成功:

    服务状态
    dbrunning
    wordpressrunning
    phpmyadminrunning

    5. 首次访问:通过浏览器完成 WordPress 首次安装

    浏览器访问:

    http://localhost

    第一次访问会进入 WordPress 安装向导:

    1. 选择语言
    2. 输入站点名称、管理员账号密码
    3. 完成安装并进入后台

    之后,你就能正常管理网站、安装主题、安装插件、写文章了。

    6. 数据库管理:通过 phpMyAdmin 图形界面管理数据库

    phpMyAdmin 是一个流行的、基于 Web 的 MySQL 数据库管理工具。如果你需要手动检查 WordPress 的数据表结构、备份数据,或进行高级的数据库操作,可以使用这个工具。

    浏览器访问:

    http://localhost:8080

    登录时,请使用您在 docker-compose.yml 文件中为 db 服务配置的凭证:

    字段
    用户名wordpress
    密码wordpress

    7. 容器操作:停止、重启与日志查看

    动作命令
    停止所有服务docker compose down
    重启所有服务docker compose restart
    查看日志docker compose logs -f

    停止不会删除数据,因为数据库文件和网站文件都保存在你本地文件夹里。

    现在你成功拥有了本地 WordPress 环境

    以后开发或者测试主题、插件,都只需要:

    docker compose up -d

    就能一键启动 WordPress

  • 小米 Redmi 5 Plus (vince) 刷入 postmarketOS 教程

    在 Debian 13 系统环境下完全通过命令行为小米 Redmi 5 Plus (vince) 手机刷入轻量级的 postmarketOS 移动操作系统

    1. 前提条件

    1. 您的 Redmi 5 Plus 必须已经 解锁 Bootloader
    2. 电脑已安装 Debian 13 系统。

    2. 安装必要工具

    2.1 安装 Python(推荐使用 Miniconda)

    wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
    bash ~/Miniconda3-latest-Linux-x86_64.sh
    python --version

    提示: 安装完成后,您可能需要重启终端或运行 source ~/.bashrc 让python命令生效。

    2.2 安装 fastboot

    sudo apt install android-sdk-platform-tools-common android-sdk-platform-tools

    2.3 安装 pmbootstrap

    git clone https://gitlab.postmarketos.org/postmarketOS/pmbootstrap.git
    cd pmbootstrap
    pip install .
    pmbootstrap --version

    3. 初始化 pmbootstrap 配置

    运行初始化命令并根据提示进行配置。

    pmbootstrap init

    配置选项及推荐值:

    序号选项描述 (原文/翻译)您的输入/选择目的或说明
    1Work path (工作路径)回车 (默认)默认路径通常最佳。
    2pmaports path (pmaports 路径)回车 (默认)存放 postmarketOS 软件包定义文件的路径。
    3Available postmarketOS release (选择发行版)v25.06选择您希望安装的 postmarketOS 版本。
    4Vendor (选择设备厂商)qcomRedmi 5 Plus 采用高通芯片。
    5Device codename (选择设备型号)msm8953Redmi 5 Plus 所属的平台代号。
    6Username (设置用户名)qixinlee替换为您想要的用户名。
    7Available providers for postmarketos-base-ui-wifi (选择 WiFi 后端)回车 (默认)默认选择 default 即可。
    8User interface (选择用户界面)phosh推荐 Phosh,它是一个基于 GNOME 的移动界面。
    9Install systemd? (是否安装 systemd)回车 (默认)默认选择 y
    10Change them? (y/n) (更改额外选项)回车 (默认 n)通常无需更改。
    11Extra packages (额外软件包)回车 (默认 none)暂不添加额外软件包。
    12Use this timezone instead of GMT? (使用此本地时区)回车 (默认 y)使用本地时间而非 GMT。
    13Locale (选择本地化语言环境)回车 (默认 en_US)推荐使用 en_US,以确保兼容性。
    14Device hostname (设置设备主机名)回车 (默认)设备在网络上的名称。
    15Build outdated packages? (构建过时包)回车 (默认 y)允许构建可能过时的包,提高成功率。
    16Zap existing chroots…? (清空已有 chroot)回车 (默认 y)确保配置能立即生效。

    4. 构建系统 (Install)

    开始构建 postmarketOS 系统镜像。

    pmbootstrap install

    系统会提示设置用户登录密码,请根据提示输入两次密码:

    *** SET LOGIN PASSWORD FOR: 'qixinlee' ***
    New password:
    Retype new password:

    5. 电脑连接设备进行刷写

    将手机进入 Fastboot 模式:关闭手机电源,然后同时按住 音量下键电源键,直到屏幕上出现 Fastboot 字样,连接电脑。

    5.1 确认设备已连接

    sudo fastboot devices

    提示: 如果能看到设备序列号,则连接成功。

    5.2 刷入 lk2nd (引导加载程序)

    pmbootstrap flasher flash_lk2nd

    5.3 刷入 rootfs (系统文件系统)

    pmbootstrap flasher flash_rootfs

    5.4 重启设备

    sudo fastboot reboot

    设备将自动启动进入您所选择的 postmarketOS 用户界面

  • Debian12 升级 Debian13 记录

    Debian 12 (Bookworm) 系统升级至 Debian 13 (Trixie) 的过程记录

    1. 更新当前系统

    确保你的 Debian 12 系统处于最新状态。

    # 更新软件包列表
    apt update
    
    # 升级所有已安装的软件包
    apt upgrade
    
    # 移除不再需要的软件包和依赖项
    apt autoremove

    2. 检查当前系统版本

    升级前先确认系统版本:

    # 查看系统 Debian 版本
    
    cat /etc/debian_version

    输出结果为:

    12.12

    3. 修改软件源为 Debian 13 (Trixie)

    升级到新版本需要将系统的软件包源从 bookworm 更改为 trixie

    创建备份:备份现有的软件源文件,以防万一。

    mv /etc/apt/sources.list /etc/apt/sources.list.backup

    创建新的软件源文件,使用 /etc/apt/sources.list.d/ 目录来管理软件源,这比直接修改 sources.list 更灵活

    nano /etc/apt/sources.list.d/debian.sources

    将以下内容粘贴到新创建的文件中。软件源指向 Debian 13 (Trixie) 的主仓库、更新仓库和安全仓库。

    Types: deb
    URIs: https://deb.debian.org/debian
    Suites: trixie trixie-updates
    Components: main non-free-firmware
    Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
    
    Types: deb
    URIs: https://security.debian.org/debian-security
    Suites: trixie-security
    Components: main non-free-firmware
    Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

    4. 升级到 Debian 13

    执行更新并进行完整升级:

    # 刷新软件包列表
    apt update
    
    # 执行完整系统升级
    apt full-upgrade
    
    # 清理不再需要的软件包
    apt autoremove

    在 apt full-upgrade 过程中,如果系统询问是否保留修改过的配置文件,请仔细阅读提示。通常情况下,选择 N(保留当前版本) 是更安全的选择,以避免配置丢失或覆盖。

    5. 验证升级结果

    升级完成后,检查 Debian 版本:

    # 查看系统 Debian 版本
    
    cat /etc/debian_version

    输出:

    13.1

    说明系统已成功升级到 Debian 13.1

  • Red Hat Enterprise Linux 10 更新排错:403 权限错误的排查与处理

    在日常的 Linux 运维工作中保持系统更新是至关重要的。最近在维护 Red Hat Enterprise Linux (RHEL) 10 系统时,我遇到了一个让人头疼的问题:执行 dnf update 命令时,系统反复报出“Status code: 403 Forbidden”的错误。尽管 subscription-manager 显示系统已注册,但软件仓库的访问权限似乎被拒绝了。

    1. 问题现象:dnf update 403 错误

    我在终端执行系统更新命令 dnf update 时,出现了以下错误信息:

    dnf update

    系统报错:

    Errors during downloading metadata for repository 'rhel-10-for-x86_64-appstream-rpms':
      - Status code: 403 for https://cdn.redhat.com/content/dist/rhel10/10/x86_64/appstream/os/repodata/repomd.xml
    Error: Failed to download metadata for repo 'rhel-10-for-x86_64-appstream-rpms': Cannot download repomd.xml: All mirrors were tried

    报错中的“Status code: 403”是关键线索。在 HTTP 协议中,403 状态码意味着“权限被禁止”。这表明我的请求已成功发送至 Red Hat 服务器,但服务器因权限问题拒绝了我的访问。

    2. 初步排查

    既然是权限问题,我首先想到了系统订阅状态。执行 subscription-manager status 命令后,结果显示一切正常:

    subscription-manager status
    Overall Status: Registered

    这让我陷入了困惑。系统明明显示已注册,无法访问官方仓库?这说明本地的注册信息可能存在异常或缓存失效。

    为了尝试修复,我决定重新注册 Insights 客户端:

    insights-client --unregister
    insights-client --register

    但新的问题出现了:

    Machine-id found, insights-client can not be registered. Please, unregister insights-client first

    系统中的某些残留信息阻止了重新注册,即使我已尝试注销。这进一步证实了问题出在本地已损坏或过时的注册数据上。

    3. 解决步骤:彻底清除并重新注册

    步骤一:清除本地订阅数据

    使用 subscription-manager clean 命令,该命令会移除所有本地存储的订阅和授权信息

    subscription-manager clean

    执行后,终端会返回 All local data removed,这表明旧的、可能已损坏的授权数据已经被彻底清除。

    步骤二:重新注册系统

    清除数据后,系统将处于未注册状态。我们可以使用 subscription-manager register 命令进行重新注册,并输入正确的 Red Hat 账户凭据。

    subscription-manager register

    系统会提示输入用户名和密码,注册成功后会返回新的系统 ID:

    Registering to: subscription.rhsm.redhat.com:443/subscription
    Username: <你的 Red Hat 账户用户名>
    Password: <你的 Red Hat 账户密码>
    The system has been registered with ID: ...

    步骤三:验证更新

    完成重新注册后,再次执行 dnf update。这次,系统终于能够顺利连接到 Red Hat 软件仓库,并开始下载元数据和软件包。

    dnf update
    
    Updating Subscription Management repositories.
    Red Hat Enterprise Linux 10 for x86_64 - BaseOS (RPMs)   

    问题完美解决。