标签: Linux

  • 小米 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)   

    问题完美解决。

  • 使用 Podman 部署 Cockpit 和 Immich 机器学习容器

    使用 Podman 部署安装 Cockpit 管理工具并使用 Podman 启动 Immich 的机器学习容器。以便在浏览器中方便配置和访问

    一、开放所需端口

    在默认情况下,Linux 防火墙(firewalld)可能会阻止一些端口的外部访问。为了确保 Cockpit 和 Immich 模块能够正常被访问,需要永久放行相关端口。

    1. 放行 9090 端口(用于 Cockpit)

    firewall-cmd --add-port=9090/tcp --permanent
    firewall-cmd --reload

    2. 放行 3003 端口(用于 Immich 机器学习容器)

    firewall-cmd --permanent --add-port=3003/tcp
    firewall-cmd --reload

    二、安装 Cockpit 和 Podman

    Cockpit 是一款轻量级的 Web 管理工具,可用于查看系统信息、容器、服务等。

    dnf install podman cockpit cockpit-podman -y

    安装完成后,启用并启动 Cockpit:

    systemctl enable --now cockpit.socket

    然后可通过浏览器访问 Cockpit:

    https://<你的服务器IP>:9090

    注意:首次访问时浏览器可能提示 SSL 证书不安全,可选择“继续前往”。

    三、部署 Immich Machine Learning 容器

    Immich 是一个支持自动图片整理、面部识别等功能的自托管照片管理系统。我们配置immich的远程机器学习提高计算速度

    1. 下载镜像

    podman pull ghcr.io/immich-app/immich-machine-learning:release

    2. 运行容器

    podman run \
      --name immich_machine_learning \
      --restart=always \
      --replace \
      -p 3003:3003 \
      -v model-cache:/cache \
      -e TZ=Asia/Shanghai \
      -d \
      ghcr.io/immich-app/immich-machine-learning:release

    此命令的作用如下:

    • --name: 指定容器名称
    • --restart=always: 容器自动重启策略
    • --replace: 替换已有同名容器
    • -p 3003:3003: 映射本地端口
    • -v model-cache:/cache: 使用持久卷缓存模型
    • -e TZ=Asia/Shanghai: 设置时区
    • -d: 后台运行容器

    四、配置容器开机自动启动(可选但推荐)

    虽然运行容器时使用了 --restart=always,但 Podman 默认并不会像 Docker 一样在系统启动时自动重启容器。要实现真正的“开机自启”,需依赖 systemd 启动服务。

    1. 生成并安装 systemd 单元文件

    podman generate systemd --name immich_machine_learning --files --restart-policy=always

    这将在当前目录生成 container-immich_machine_learning.service 文件。将其移动到系统服务目录并启用:

    mv container-immich_machine_learning.service /etc/systemd/system/
    systemctl daemon-reexec
    systemctl enable container-immich_machine_learning.service

    五、验证部署

    • 访问 Cockpit Web 控制台查看容器状态:
      https://<你的服务器IP>:9090
    • 访问 Immich ML 控制台查看容器状态:
      http://<你的服务器IP>:3003

  • RHEL 10 局域网 Repo 服务器配置指南

    在一台 Red Hat Enterprise Linux 10 (RHEL 10) 主机配置为本地 Repo 服务器。通过此设置,局域网内的其他 RHEL 10 客户端将能够高效地进行系统更新和软件包安装,无需直接连接到 Red Hat 官方仓库提供更快更稳定的传输。

    1. 前提条件

    在开始配置之前,请确保满足以下条件:

    • 操作系统: 一台已安装 Red Hat Enterprise Linux 10 (RHEL 10) 的物理机或虚拟机。
    • Red Hat 订阅: 拥有一个有效的、已附加到该主机的 Red Hat 订阅。
    • 网络连接: 能够访问互联网,以便从 Red Hat 官方同步软件包。
    • IP 地址: Repo 服务器拥有一个固定的局域网 IP 地址,例如 192.168.1.199。
    • 存储空间: 至少拥有 1TB 的可用磁盘空间。
    • 权限: 拥有 root 权限。

    2. Repo 服务器配置步骤

    2.1. 注册Red Hat Subscription Management 并刷新订阅信息

    注册 Red Hat Subscription Management 并刷新订阅信息,以确保能够访问 Red Hat 官方仓库。

    [root@192-168-1-199 ~]# subscription-manager register

    注册完成后,刷新机器上的信息:

    [root@192-168-1-199 ~]# subscription-manager refresh
    All local data refreshed

    2.2. 安装并配置 Apache Web 服务器

    使用 Apache HTTP Server 来提供同步的软件包文件。

    [root@192-168-1-199 ~]# dnf update -y
    [root@192-168-1-199 ~]# dnf install -y httpd
    [root@192-168-1-199 ~]# systemctl start httpd
    [root@192-168-1-199 ~]# systemctl enable httpd

    配置防火墙以允许 HTTP 流量(默认端口 80):

    [root@192-168-1-199 ~]# firewall-cmd --permanent --add-port=80/tcp
    success
    [root@192-168-1-199 ~]# firewall-cmd --reload
    success

    2.3. 安装 yum-utils 工具

    yum-utils 软件包包含了 reposync 工具,用于同步远程仓库。

    [root@192-168-1-199 ~]# dnf install -y yum-utils

    2.4. 查看已启用的仓库 ID

    在同步软件包之前,我们需要确认哪些 Red Hat 仓库是可用的。

    [root@192-168-1-199 ~]# dnf repolist
    Updating Subscription Management repositories.
    repo id                               repo name
    rhel-10-for-x86_64-appstream-rpms     Red Hat Enterprise Linux 10 for x86_64 - AppStream (RPMs)
    rhel-10-for-x86_64-baseos-rpms        Red Hat Enterprise Linux 10 for x86_64 - BaseOS (RPMs)

    从输出中可以看到,我们需要同步的仓库 ID 是 rhel-10-for-x86_64-baseos-rpms 和 rhel-10-for-x86_64-appstream-rpms。

    2.5. 创建本地仓库存储目录

    把同步的软件包存储在 Apache 的默认网站根目录 /var/www/html/ 下的一个子目录 rhel10-repo 中。

    [root@192-168-1-199 ~]# mkdir -p /var/www/html/rhel10-repo

    2.6. 同步 Red Hat 仓库

    使用 reposync 命令同步 BaseOS 和 AppStream 仓库。

    # 同步 BaseOS 仓库
    reposync --repo=rhel-10-for-x86_64-baseos-rpms -p /var/www/html/rhel10-repo --newest-only --delete
    
    # 同步 AppStream 仓库
    reposync --repo=rhel-10-for-x86_64-appstream-rpms -p /var/www/html/rhel10-repo --newest-only --delete
    • --repo=<repo_id>: 指定要同步的仓库 ID。
    • -p /path/to/download: 指定下载软件包的本地路径。
    • --newest-only: 只下载每个软件包的最新版本,这可以节省大量的磁盘空间和同步时间。
    • --delete: 删除本地仓库中已不存在于远程仓库的软件包,以保持同步。

    2.7. 创建仓库元数据

    同步完成后,需要为本地仓库创建元数据,以便客户端能够识别和使用这些软件包。如果未安装 createrepo_c,请先安装:

    [root@192-168-1-199 ~]# dnf install -y createrepo_c

    为每个同步的仓库创建元数据:

    # 为 BaseOS 仓库创建元数据
    [root@192-168-1-199 ~]# createrepo_c /var/www/html/rhel10-repo/rhel-10-for-x86_64-baseos-rpms/
    
    # 为 AppStream 仓库创建元数据
    [root@192-168-1-199 ~]# createrepo_c /var/www/html/rhel10-repo/rhel-10-for-x86_64-appstream-rpms/

    您可以通过浏览器访问 http://192.168.1.199/rhel10-repo/ 来验证目录结构和文件是否已成功同步。

    3. 配置局域网客户端

    在局域网内需要使用此本地 Repo 服务器的 RHEL 10 客户端机器上,进行以下配置:

    3.1. 备份并禁用现有 Red Hat 仓库

    首先备份并禁用客户端上现有的 Red Hat 官方仓库配置,以避免冲突。

    [root@client-machine ~]# mkdir -p /etc/yum.repos.d/bak
    [root@client-machine ~]# mv /etc/yum.repos.d/redhat.repo /etc/yum.repos.d/bak/

    3.2. 创建新的本地仓库文件

    创建一个新的 .repo 文件,指向您的本地 Repo 服务器。

    [root@client-machine ~]# vi /etc/yum.repos.d/local-rhel10.repo

    在文件中添加以下内容:

    [local-baseos]
    name=Local RHEL 10 BaseOS
    baseurl=http://192.168.1.199/rhel10-repo/rhel-10-for-x86_64-baseos-rpms/
    enabled=1
    gpgcheck=0
    
    [local-appstream]
    name=Local RHEL 10 AppStream
    baseurl=http://192.168.1.199/rhel10-repo/rhel-10-for-x86_64-appstream-rpms/
    enabled=1
    gpgcheck=0
    • baseurl: 指向您的 Repo 服务器的 IP 地址和正确的仓库路径。
    • enabled=1: 表示启用这个仓库。
    • gpgcheck=0: 表示不进行 GPG 密钥检查。在受信任的内部局域网环境中,这通常是可以接受的简化操作。如果您希望启用 GPG 检查以提高安全性,则需要将 Red Hat 的 GPG 密钥导入到客户端。

    3.3. 清除 dnf 缓存并测试

    清除 dnf 缓存并测试是否能正确列出新的本地仓库。

    [root@client-machine ~]# dnf clean all
    [root@client-machine ~]# dnf repolist

    如果一切配置正确,您应该会看到 local-baseos 和 local-appstream 这两个仓库。

    4. 自动化维护

    为了确保本地 Repo 服务器始终提供最新的软件包,建议设置一个定时任务来定期同步仓库和更新元数据。

    4.1. 创建自动化脚本

    在 Repo 服务器上创建一个脚本,用于执行 reposync 和 createrepo_c 命令。

    [root@192-168-1-199 ~]# mkdir -p /root/script/
    [root@192-168-1-199 ~]# vi /root/script/update_local_repo.sh

    添加以下内容到 update_local_repo.sh 文件中:

    #!/bin/bash
    
    # 脚本日志文件
    LOG_FILE="/var/log/repo_sync.log"
    
    # 要同步的仓库ID列表
    REPOS=(
      "rhel-10-for-x86_64-baseos-rpms"
      "rhel-10-for-x86_64-appstream-rpms"
    )
    
    # 仓库根目录
    REPO_PATH="/var/www/html/rhel10-repo"
    
    echo "==========================================" >> $LOG_FILE
    echo "脚本开始于: $(date)" >> $LOG_FILE
    
    # 同步所有仓库
    for REPO_ID in "${REPOS[@]}"; do
      echo "--> 正在同步仓库: $REPO_ID" | tee -a $LOG_FILE
      reposync --repo=$REPO_ID -p $REPO_PATH --newest-only --delete >> $LOG_FILE 2>&1
    done
    
    # 为更新后的仓库重新创建元数据
    for REPO_ID in "${REPOS[@]}"; do
      REPO_DIR="$REPO_PATH/$REPO_ID"
      if [ -d "$REPO_DIR" ]; then
        echo "--> 正在为 $REPO_ID 创建元数据" | tee -a $LOG_FILE
        createrepo_c -v $REPO_DIR >> $LOG_FILE 2>&1
      fi
    done
    
    echo "脚本结束于: $(date)" >> $LOG_FILE
    echo "==========================================" >> $LOG_FILE

    4.2. 授予脚本执行权限

    [root@192-168-1-199 ~]# chmod +x /root/script/update_local_repo.sh

    4.3. 设置 Cron 定时任务

    编辑 crontab,设置脚本在每天凌晨 2:30 自动运行。

    [root@192-168-1-199 ~]# crontab -e

    在打开的 crontab 编辑器中添加以下一行:

    30 2 * * * /root/script/update_local_repo.sh

    查看crontab 任务计划列表

    [root@192-168-1-199 ~]# crontab -l
    30 2 * * * /root/script/update_local_repo.sh
    [root@192-168-1-199 ~]#

    本地 Repo 服务器将每天自动同步 Red Hat 官方仓库并更新元数据,确保局域网内的客户端始终能够获取到最新的软件包。

  • Debian 12 GNOME 允许 root 登录

    Debian 12 GNOME 默认禁止 root 用户直接登录桌面环境,旨在防止误操作并降低潜在风险。然而,在某些特定场景下,例如系统深度调试或特殊的运维需求,可能需要直接以 Root 身份登录。

    GNOME开启 root 登录步骤

    1. 编辑 PAM 配置文件
    sudo nano /etc/pam.d/gdm-password

    找到以下行:

    auth    required        pam_succeed_if.so user != root quiet_success

    在行首添加 # 注释掉:

    #auth    required        pam_succeed_if.so user != root quiet_success

    保存并退出编辑器。

    1. 确认 Root 用户已设置密码
    sudo passwd root

    输入并确认 Root 密码。

    1. 重启 GDM 服务
    sudo systemctl restart gdm

    或者重启系统:

    sudo reboot
    1. 登录

    在登录界面输入用户名 root 和密码,即可进入 GNOME 桌面。