标签: Linux

  • 使用 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-rpmsrhel-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 命令同步 BaseOSAppStream 仓库。

    # 同步 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-baseoslocal-appstream 这两个仓库。

    4. 自动化维护

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

    4.1. 创建自动化脚本

    在 Repo 服务器上创建一个脚本,用于执行 reposynccreaterepo_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 桌面。

  • Chromedriver 安装全平台指南

    Chromedriver 是用于驱动 Chrome 浏览器的 WebDriver,广泛用于自动化测试与网页数据抓取。本文提供各操作系统下安装 Chromedriver 的步骤。

    一、 各版本下载地址

    你可以在该页面查找与你本地 Chrome 浏览器版本对应的 chromedriver

    https://googlechromelabs.github.io/chrome-for-testing/#stable

    macOS安装

    # 下载Chromedriver
    curl -O https://storage.googleapis.com/chrome-for-testing-public/136.0.7103.114/mac-x64/chromedriver-mac-x64.zip
    
    # 解压
    unzip chromedriver-mac-x64.zip
    
    # 安装到系统路径
    sudo cp chromedriver /usr/local/bin/
    
    # 设置可执行权限
    sudo chmod +x /usr/local/bin/chromedriver
    
    # 验证安装是否成功
    chromedriver --version

    Windows x64安装

    # 下载 Chromedriver:
    https://storage.googleapis.com/chrome-for-testing-public/136.0.7103.94/win64/chromedriver-win64.zip
    
    # 解压 chromedriver-win64.zip 至任意目录,例如:
    C:\tools\chromedriver
    
    # 添加环境变量:
    将 chromedriver.exe 所在目录添加至系统环境变量 Path。
    
    操作路径:
    此电脑 → 属性 → 高级系统设置 → 环境变量 → 编辑 Path
    
    # 验证是否安装成功:
    打开命令提示符(Win + R,输入 cmd)后执行:
    
    chromedriver --version

    Linux 安装

    # 下载Chromedriver
    
    wget https://storage.googleapis.com/chrome-for-testing-public/136.0.7103.94/linux64/chromedriver-linux64.zip
    
    # 解压
    unzip chromedriver-linux64.zip
    
    # 安装到系统路径
    sudo cp chromedriver /usr/local/bin/
    
    # 设置可执行权限
    sudo chmod +x /usr/local/bin/chromedriver
    
    # 验证安装是否成功
    chromedriver --version
  • 使用 opkssh 实现 OpenID 身份验证与 SSH 连接

    opkssh 是一个结合 OpenID 身份验证和 SSH 连接的工具,它能简化 SSH 密钥的管理,并提升 SSH 连接的安全性。与传统的 SSH 密钥验证方式不同,opkssh 通过 OpenID 身份验证来生成 SSH 密钥,使得用户的身份验证更加灵活与安全。

    1. 安装 opkssh

    opkssh 可以在 Windows、macOS 和 Linux 系统上使用。下面是详细的安装步骤:

    在 Windows 上安装 opkssh

    1. 打开 PowerShell 或命令提示符。
    2. 执行以下命令,下载并安装 opkssh
    curl https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-windows-amd64.exe -o opkssh.exe
    1. 下载完成后,你将获得 opkssh.exe 文件。你可以将它放在任何你想要的目录下,并通过命令行运行它。

    在 macOS 上安装 opkssh

    1. 打开终端。
    2. 执行以下命令,下载并安装 opkssh
    curl -L https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-osx-amd64 -o opkssh; chmod +x opkssh
    1. 这将下载 opkssh 文件并授予执行权限。你可以将其移动到 /usr/local/bin/ 目录,方便在终端中全局使用。

    在 Linux 上安装 opkssh

    Linux 系统支持多种架构。根据你的系统架构(x86_64 或 ARM64),选择相应的安装命令。

    • 对于 x86_64 架构的 Linux 系统
    curl -L https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-linux-amd64 -o opkssh; chmod +x opkssh
    • 对于 ARM64 架构的 Linux 系统
    curl -L https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-linux-arm64 -o opkssh; chmod +x opkssh

    安装完成后,你可以将 opkssh 文件移动到 /usr/local/bin/ 目录,或将其保留在当前目录。

    2. 使用 opkssh 进行身份验证与 SSH 登录

    安装完成后,你可以开始使用 opkssh 进行身份验证和 SSH 连接。

    登录并生成 SSH 密钥

    1. 在终端或命令行中运行以下命令:
    opkssh login
    1. 该命令将打开一个浏览器窗口,要求你选择一个 OpenID 提供商并完成身份验证。你可以选择 Google、GitHub 等常见的 OpenID 提供商来进行登录。
    2. 登录成功后,opkssh 会在你的本地系统中生成一个 SSH 公钥文件,默认位置是 ~/.ssh/id_ecdsa。这个密钥对应的是你的 OpenID Token,凭此可以通过 SSH 连接到服务器。

    默认 SSH 密钥过期时间

    生成的 SSH 密钥默认会在 24 小时后过期。到期后,你需要重新运行 opkssh login 来生成新的密钥。

    使用 SSH 登录

    一旦密钥生成成功,你可以像使用传统 SSH 密钥一样使用它来登录到远程服务器。执行以下命令:

    ssh [email protected]

    使用 SFTP 进行文件传输

    你还可以使用 opkssh 生成的 SSH 密钥进行 SFTP 文件传输:

    sftp [email protected]

    3. 自定义 SSH 密钥名称

    opkssh 允许你为生成的密钥指定自定义名称,方便管理。

    登录时指定自定义密钥名称

    如果你希望使用特定名称的密钥,可以在执行 opkssh login 时指定密钥名称:

    opkssh login -i opkssh_server_group1

    使用自定义密钥进行 SSH 连接

    在使用 SSH 时,你可以通过 -i 参数指定自定义的密钥文件。假设你使用了 opkssh_server_group1 作为密钥名称,可以执行以下命令:

    ssh -o "IdentitiesOnly=yes" -i ~/.ssh/opkssh_server_group1.pub -i ~/.ssh/opkssh_server_group1 [email protected]

    这里的 -o "IdentitiesOnly=yes" 参数会确保 SSH 仅使用指定的密钥进行身份验证,避免使用其他默认密钥进行干扰。

    4. 在服务器端安装和配置 opkssh

    为了让你的服务器支持使用 opkssh 进行身份验证,你需要在服务器上安装并配置它。

    安装 opkssh 在服务器上

    1. 登录到你的服务器。
    2. 使用以下命令安装 opkssh
    wget -qO- "https://raw.githubusercontent.com/openpubkey/opkssh/main/scripts/install-linux.sh" | sudo bash

    这条命令会自动下载并安装 opkssh,并将其放置在 /usr/local/bin/ 目录中,同时配置 SSH 服务以支持 opkssh 作为附加的身份验证机制。

    允许单个用户使用 opkssh 登录

    如果你想允许某个用户(例如 [email protected])通过 OpenID 进行身份验证并作为 root 登录到服务器,可以执行以下命令:

    sudo opkssh add root [email protected] google

    允许用户组使用 opkssh 登录

    如果你希望允许某个用户组(例如 ssh-users)中的所有成员通过 OpenID 进行身份验证并作为 root 登录,可以使用以下命令:

    sudo opkssh add root oidc:groups:ssh-users google
  • Multipass使用cloud-init 启动 Ubuntu 24.04 虚拟机

    使用 Multipass 启动一台基于 Ubuntu 24.04 的虚拟机,并通过 cloud-init.yaml 实现自动化配置。配置内容包括创建用户、禁用 root 和密码登录、启用 SSH 公钥认证,确保系统安全且易于远程管理。只需一条命令即可快速部署完成,非常适合开发和测试场景使用。

    1. 创建 cloud-config.yaml

    生成 SSH 密钥对(或准备好现有公钥):

    ssh-keygen -t ed25519 -C "liqixin@vm"

    公钥会保存在 ~/.ssh/id_ed25519.pub 中。

    创建一个名为 cloud-config.yaml 的文件:

    # cloud-config.yaml
    users:
      - name: liqixin
    sudo: ALL=(ALL) NOPASSWD:ALL
    shell: /bin/bash
    lock_passwd: true
    ssh_authorized_keys:
      - ssh-ed25519 AAAA liqixin@vm
    
    disable_root: true
    ssh_pwauth: false

    请把 ssh-ed25519 AAAA... 替换成你自己的公钥内容(~/.ssh/id_ed25519.pub 里的内容)。

    2. 启动 VM

    在 cloud-config 文件所在目录,运行以下命令:

    multipass launch 24.04 \
      --name liqixin-vm \
      --cpus 1 \
      --memory 1G \
      --disk 10G \
      --cloud-init cloud-config.yaml

    这会:

    • 下载 Ubuntu 24.04(首次执行会下载镜像)
    • 创建名为 liqixin-vm 的虚拟机
    • 启动时自动创建 liqixin 用户,并配置好免密 SSH 登录

    3. 通过 SSH 登录

    Multipass 默认会自动配置主机与 VM 的网络连接,你可以用以下方式连接:

    multipass info liqixin-vm

    输出中找到 IP 地址,例如:

    liqixin-vm:
      ...
      IPv4: 192.168.64.3

    然后用你的私钥直接 SSH 登录:

    ssh -i ~/.ssh/id_ed25519 [email protected]

    首次连接需要确认 fingerprint,之后就可以直接连了。

    4. 清理 / 删除 VM

    如果以后不需要这个 VM,可以这样清理:

    multipass delete liqixin-vm
    multipass purge