第一步：在A中生成密钥在A进入~/.ssh文件夹，执行以下命令：ssh-keygen -t rsa一路回车后，在~/.ssh下会生成 id_rsa，和 id_rsa.pub，其中id_rsa是密钥，id_rsa.pub是公钥。第二步：把在 A 机生成的 id_rsa.pub 拷贝到 B 机上。怎么跨主机复制文件呢，下面的命令可以做到：(假设放在 B 的 tmp 目录中)scp id_rsa.pub root@B:/tmp //scp -r是拷贝文件夹 # 举个例子：将服务器的/www/api/ 复制到本地的~/www（在本地执行） scp -r root@101.200.52.143:/www/api/ ~/www 第三步：将刚才拷贝的 id_rsa.pub 公钥文件拷贝到 B 的 authorized_keys 目录中（没有就创建，注意权限不能是777，可以设置成700或者400）：cd ~/.ssh cat /tmp/id_rsa.pub>>authorized_keys
双卡配置说明（3080 Ti 20G + 1070 8G）重要结论vLLM 不支持 GTX 1070：需要 Compute Capability 7.0+，1070 为 6.1，无法用 vLLM 跑推理或放 KV cache。推荐用法：仅用 3080 Ti 跑 vLLM，通过 CUDA_VISIBLE_DEVICES=0 指定（假设 3080 Ti 为 0 号卡）。1070：可留给 Ollama / 其他支持老显卡的推理、或桌面/显示用；当前方案下不参与 vLLM。指定使用 3080 Ti先确认哪张是 3080 Ti（通常 20G 的那张）：nvidia-smi --query-gpu=index,name,memory.total --format=csv假设 3080 Ti 是 0，则所有 vLLM 命令前加：export CUDA_VISIBLE_DEVICES=0 # 然后正常启动 vllm serve ...或在 Python 里（在 import vllm 之前）：import os os.environ["CUDA_VISIBLE_DEVICES"] = "0"16G 内存注意vLLM 主要吃 显存，16G 系统内存一般够用。避免同时开太多占内存的应用（浏览器、多个大模型服务等），否则易 OOM 或卡顿。推荐本地 Agent 模型（20G 显存）模型显存约说明Qwen2.5-7B-Instruct~16GB FP16通用、工具调用/agent 支持好Qwen2.5-14B-Instruct~28GB FP16 → ~18GB 量化能力更强，需 AWQ/GPTQ 等 4bitDeepSeek-R1-7B~16GB推理/思考链、agent 向Qwen2.5-1.5B/3B-Instruct很低轻量 agent/路由建议：主 agent 用 Qwen2.5-7B-Instruct 或 DeepSeek-R1-7B，20G 可轻松跑；若上 14B，需量化（如 TheBloke/Qwen2.5-14B-Instruct-AWQ）。再「挂一个 DeepSeek」若指再跑一个 DeepSeek（如 R1/CoT 等）：同卡 3080 Ti：两个模型不能同时加载进 20G，可起两个 vLLM 服务不同端口、按需启停，或一个 vLLM + 一个用 API 调远程。1070：不能用 vLLM；可用 Ollama 在 1070 上跑小模型（如 qwen2.5:3b），与 3080 Ti 上的 vLLM 分工。一键只让 vLLM 用 3080 Ti 的示例# 仅用 0 号卡（请按 nvidia-smi 确认 3080 Ti 的 index） export CUDA_VISIBLE_DEVICES=0 source /home/fsy/Desktop/VLLM/.venv/bin/activate vllm serve Qwen/Qwen2.5-7B-Instruct --trust-remote-code --port 8000#!/usr/bin/env python3 """vLLM 本地离线推理示例。首次运行会从 HuggingFace 拉取模型。""" # 仅用 3080 Ti 时，在 import vllm 前设置（或在终端 export CUDA_VISIBLE_DEVICES=0） # import os; os.environ["CUDA_VISIBLE_DEVICES"] = "0" from vllm import LLM from vllm.sampling_params import SamplingParams # Agent 推荐（20G）：Qwen/Qwen2.5-7B-Instruct、deepseek-ai/DeepSeek-R1-7B # 14B 需量化：如 TheBloke/Qwen2.5-14B-Instruct-AWQ MODEL = "Qwen/Qwen2.5-7B-Instruct" def main(): # 初始化引擎（首次会加载模型到 GPU） llm = LLM(model=MODEL, trust_remote_code=True) sampling_params = SamplingParams(temperature=0.7, max_tokens=256) prompts = ["你好，请用一句话介绍你自己。", "1+1=?"] outputs = llm.generate(prompts, sampling_params) for out in outputs: print("输入:", out.prompt) print("输出:", out.outputs[0].text) print("-" * 40) if __name__ == "__main__": main()#!/bin/bash # 仅用 3080 Ti（0 号卡）启动 vLLM，供 agent 使用 # 先运行: nvidia-smi 确认 3080 Ti 是 0 还是 1，再改下面 CUDA_VISIBLE_DEVICES export CUDA_VISIBLE_DEVICES=0 cd /home/fsy/Desktop/VLLM source .venv/bin/activate # 主 agent 模型：Qwen2.5-7B（可换成 DeepSeek-R1-7B 等） MODEL="${VLLM_MODEL:-Qwen/Qwen2.5-7B-Instruct}" PORT="${VLLM_PORT:-8000}" echo "Using GPU 0 only (3080 Ti). Model: $MODEL, port: $PORT" exec vllm serve "$MODEL" --trust-remote-code --port "$PORT" "$@"# 建议环境变量（GLM-4.7-Flash MoE 相关） export VLLM_USE_DEEP_GEMM=0 export VLLM_USE_FLASHINFER_MOE_FP16=1 export VLLM_USE_FLASHINFER_SAMPLER=0 export OMP_NUM_THREADS=4‵‵‵bash从 ModelScope 或 Hugging Face 下载到本地后，指向该路径vllm serve /path/to/cyankiwi/GLM-4.7-Flash-AWQ-4bit \ --max-model-len 65536 \ --gpu-memory-utilization 0.9 \ --tool-call-parser glm47 \ --reasoning-parser glm45 \ --trust-remote-code \ --host 0.0.0.0 \ --port 8000
GLM-4.7 部署 + llama.cpp 双卡（3080 Ti 推理 / 1070 cache）一、GLM-4.7 有没有能部署的版本？有。GLM-4.7-Flash 已开源，适合本地部署：架构：30B MoE，约 3B 活跃参数，推理显存约等于 3B 级显存：4-bit 量化约 16–18GB，3080 Ti 20G 足够能力：200K 上下文、工具调用、思考链，适合 agent获取 GGUF（给 llama.cpp 用）：lmstudio-community/GLM-4.7-Flash-GGUF：Q4_K_M / Q6_K / Q8_0bartowski/zai-org_GLM-4.7-Flash-GGUF：更多量化（Q2_K～Q8_0、IQ 系列等）推荐 20G 显存用 Q4_K_M 或 Q5_K_M。二、用 llama.cpp 实现「3080 Ti 推理 + 1070 做 cache」llama.cpp 支持多卡时：-ts / --tensor-split：按比例把模型层分到多张卡（如 -ts 1,0 = 全部在 GPU0）--main-gpu / -mg：指定哪张卡放 KV cache 和小张量（中间结果）因此可以：模型权重全部放在 3080 Ti（推理算力在这张卡）KV cache 和小张量放在 1070（--main-gpu 指向 1070）前提：3080 Ti 建议为 GPU 0，1070 为 GPU 1（用 nvidia-smi 看顺序，必要时在 BIOS/系统里调）。下面按 0=3080Ti、1=1070 写。1. llama.cpp 编译（CUDA）克隆与基础编译：git clone https://github.com/ggml-org/llama.cpp cd llama.cpp mkdir build && cd build cmake .. -DGGML_CUDA=ON cmake --build . --config Release -j可执行文件在 build/bin/，例如 llama-cli、server。若编译时出现 nvcc: Terminated / Compilation terminated，多为内存不足，改用少并行数：cmake --build . --config Release -j2 # 或 -j1若 CMake 报 CUDA Toolkit not found / Could not find nvcc，按下面处理。1.1 确认本机是否有 nvccwhich nvcc # 或 ls /usr/local/cuda*/bin/nvcc 2>/dev/null || ls /usr/bin/nvcc 2>/dev/null有输出则记下该路径的上一级目录（如 /usr/local/cuda 或 /usr/local/cuda-12.6），用作下面的 CUDAToolkit_ROOT。1.2 有 nvcc：指定 CUDAToolkit_ROOT 再配置cd ~/Desktop/llama.cpp/build rm -rf * # 把 /usr/local/cuda 换成你本机 CUDA 实际路径 cmake .. -DGGML_CUDA=ON -DCUDAToolkit_ROOT=/usr/local/cuda cmake --build . --config Release -j2若 CUDA 在其它路径，例如 /usr/local/cuda-12.6：cmake .. -DGGML_CUDA=ON -DCUDAToolkit_ROOT=/usr/local/cuda-12.61.3 没有 nvcc：安装 CUDA Toolkit# 先看驱动支持的 CUDA 版本 nvidia-smi # 右上角 "CUDA Version: 12.x" 表示驱动支持到该版本 # Ubuntu 安装 CUDA 12（按你系统选对应 repo） wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb sudo dpkg -i cuda-keyring_1.1-1_all.deb sudo apt-get update sudo apt-get -y install cuda-toolkit-12-6装好后可设置环境变量（可写入 ~/.bashrc）：export PATH=/usr/local/cuda/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH再回到 llama.cpp/build 执行：cd ~/Desktop/llama.cpp/build rm -rf * cmake .. -DGGML_CUDA=ON -DCUDAToolkit_ROOT=/usr/local/cuda cmake --build . --config Release -j21.4 使用 conda 里的 CUDA若 nvcc 来自 conda 环境：which nvcc # 若类似 /home/xxx/miniconda3/bin/nvcc，则 CUDAToolkit_ROOT 设为上一级 cmake .. -DGGML_CUDA=ON -DCUDAToolkit_ROOT=/home/xxx/miniconda32. 双卡启动（3080 Ti 推理，1070 做 cache）适用：GPU 0 = 20G 主卡（推理）、GPU 1 = 1070（8G，做 cache）。用 nvidia-smi 确认顺序。内容放在哪张卡参数模型权重GPU 0（3080 Ti）-ts 1,0（1 份在 0，0 份在 1）KV cache / 小张量GPU 1（1070）--main-gpu 1命令行示例（按本机路径改 -m、-c）：# 交互 ./llama-cli -m /path/to/GLM-4.7-Flash-xxx-Q4_K_M.gguf \ -ts 1,0 \ --main-gpu 1 \ -c 8192 \ -p "你好"Server 模式（OpenAI 兼容 API）：./server -m /path/to/GLM-4.7-Flash-xxx-Q4_K_M.gguf \ -ts 1,0 \ --main-gpu 1 \ -c 8192 \ --host 0.0.0.0 \ --port 8080-ts 1,0：模型全在 GPU 0，GPU 1 不占权重--main-gpu 1：KV cache 和临时缓冲在 GPU 1（1070）-c 8192：上下文长度，显存够可改为 32768 等结果：3080 Ti 负责算力，1070 负责 cache，适合 20G+8G 双卡。3. 若 1070 是 0 号、3080 Ti 是 1 号把「推理」放在 3080 Ti 上更合理，则：用环境变量把「逻辑 GPU 0」映射到物理 3080 Ti，例如先只暴露 3080 Ti：CUDA_VISIBLE_DEVICES=1 ./server -m model.gguf ...这样只用到 3080 Ti，1070 不参与。若坚持双卡且 1070=0、3080Ti=1，则：模型放 3080 Ti：-ts 0,1（0 份在 0，1 份在 1）cache 放 1070：--main-gpu 04. 1070 与 llama.cppllama.cpp 对老显卡（如 1070，Compute 6.1）的支持比 vLLM 宽松，一般可以跑；若遇到不兼容再考虑只用 3080 Ti（CUDA_VISIBLE_DEVICES=0 或 1 单卡）。三、GLM-4.7-Flash 快速用上（单卡 3080 Ti）若先不折腾双卡，只验证 GLM-4.7 + 3080 Ti：下载 GGUF（任选其一）lmstudio-community/GLM-4.7-Flash-GGUFbartowski/zai-org_GLM-4.7-Flash-GGUF单卡运行（仅 3080 Ti，假设为 0 号卡）CUDA_VISIBLE_DEVICES=0 ./server -m GLM-4.7-Flash-xxx-Q4_K_M.gguf -c 8192 --port 8080用 vLLM 跑 GLM-4.7-Flash 若你更习惯 vLLM，也可用 vLLM 加载 HF 格式的 zai-org/GLM-4.7-Flash（需 20G 左右显存，3080 Ti 单卡可行），但此时无法把 1070 当 cache 用（vLLM 不支持 1070）。四、小结需求方案部署 GLM-4.7用 GLM-4.7-Flash 的 GGUF（Q4_K_M 约 16–18GB）3080 Ti 推理 + 1070 做 cache用 llama.cpp：-ts 1,0 + --main-gpu 1（0=3080Ti，1=1070）仅 3080 Ti、最简单vLLM 或 llama.cpp 单卡均可；GGUF 用 llama.cpp，HF 用 vLLM把上面命令里的 -m、-c、端口和 GPU 顺序按你本机改一下即可直接用。
通过 frp + SSH 远程操作本系统1. 前置本机已安装 frp 客户端 frpc，且服务端 vc.fangsiyuan.top:10070 已部署 frps 并允许你的 token。本机 SSH 服务 已安装并监听 22 端口（sudo systemctl status ssh）。2. 配置文件客户端配置：frp/frpc.toml（放在 frp 客户端目录中）当前包含：ssh — TCP 代理，服务端端口 10022 → 本机 127.0.0.1:22若本机 SSH 不在本机 22，或 NAS 的 IP/端口不同，在 frpc.toml 里改对应 localIP/localPort。3. 启动 frp 客户端# 前台运行（调试用） frpc -c /usr/local/bin/frpc.toml建议用 systemd 常驻（见下节）。4. 远程 SSH 连接frpc 正常连上服务端后，在任意一台能访问 vc.fangsiyuan.top 的电脑上执行：ssh -p 10022 你的本机用户名@vc.fangsiyuan.top例如本机用户名为 fsy：ssh -p 10022 fsy@vc.fangsiyuan.top即通过 frp 的 10022 端口连到本机 22，实现远程操作本系统。5. systemd 常驻（可选）若 frpc 安装在 PATH 中，可建服务：sudo tee /etc/systemd/system/frpc.service << 'EOF' [Unit] Description=frp client After=network.target [Service] Type=simple ExecStart=/usr/local/bin/frpc -c /usr/local/bin/frpc.toml Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF sudo systemctl daemon-reload sudo systemctl enable --now frpc sudo systemctl status frpc若 frpc 不在 /usr/bin/frpc，把 ExecStart 里的路径改成 which frpc 的结果。6. 注意服务端需在 frps 中开放 10022（或你用的 remotePort），否则 SSH 隧道不通。token 和端口仅作示例，实际部署注意安全与权限。
Ubuntu 24.04（内核 6.17）上对 UGREEN WiFi6 AX300（AIC8800）驱动的适配与安装过程
AIC8800 WiFi 驱动：6.17 内核适配与安装总结记一次在Ubuntu 24.04（内核 6.17）上对 UGREEN WiFi6 AX300（AIC8800）驱动的适配与安装过程。资源下载绿联官方驱动下载（Linux） 绿联 Wi-Fi 6 无线网卡 AX300 系列驱动（Linux 系统） 适用型号：CM760-25262、CM761-35263、CM860-75511、CM957-75614 | 文件版本：V1.6一、背景与问题终端沙箱报错 在 Cursor 中出现 “Terminal sandbox could not start”，与 Linux 6.2+ 的 AppArmor 有关。可安装官方 AppArmor 包或使用 ~/.cursor/sandbox.json 中 "type": "insecure_none" 临时关闭沙箱。驱动编译失败 执行 sudo apt install curl 时触发了未配置完成的 aic8800fdrvpackage，其 post-install 脚本在编译内核模块时失败，原因包括：内核 6.17 中 del_timer / del_timer_sync 已改为 timer_delete / timer_delete_sync5.4+ 中 wakeup_source_create/add/remove/destroy 已移除，需用 wakeup_source_register / wakeup_source_unregistercfg80211 回调 set_wiphy_params、set_tx_power 增加 radio_idx 参数cfg80211_rx_spurious_frame、cfg80211_rx_unexpected_4addr_frame 增加 link_id 参数定时器回调中 from_timer 需改为 container_of 等适配部分 switch 需要显式 fallthrough 以消除 -Wimplicit-fallthrough 报错二、源码修改清单（6.17 内核适配）驱动源码路径：aic8800_linux_drvier/drivers/aic8800/aic8800_fdrv/（及同目录下相关文件）。文件修改内容aicwf_tcp_ack.c增加 #include <linux/timer.h>rwnx_compat.h增加 #include <linux/timer.h>；6.2+ 用宏将 del_timer/del_timer_sync 映射为 timer_delete/timer_delete_sync；6.2+ 为 from_timer 提供兼容宏（实际多数处已改为 container_of）rwnx_wakelock.c5.4+ 使用 wakeup_source_register(dev,name) 与 wakeup_source_unregister(ws)；rwnx_wakeup_init 改为接收 struct rwnx_hw * 以传入 dev；rwnx_wakeup_deinit 在 5.4+ 仅调用 wakeup_source_unregisterrwnx_wakelock.hrwnx_wakeup_init 声明改为 (struct rwnx_hw *, const char *)；增加 struct rwnx_hw 前向声明rwnx_main.c增加 #include <linux/timer.h>；set_wiphy_params 在 6.2+ 增加 int radio_idx；set_tx_power 在 6.2+ 增加 int radio_idx；定时器回调中用 container_of(t, struct rwnx_hw, p2p_alive_timer) 等替代 from_timer；多处 switch 增加 fallthrough;rwnx_rx.c增加 #include <linux/timer.h>；6.2+ 对 cfg80211_rx_spurious_frame / cfg80211_rx_unexpected_4addr_frame 增加第三参数 link_id（传 -1）；defrag_timeout_cb、reord_timeout_handler 中用 container_of(t, struct defrag_ctrl_info, defrag_timer) 等替代 from_timerrwnx_tx.c一处 switch 增加 fallthrough;aicwf_sdio.c定时器回调中用 container_of(t, struct aic_sdio_dev, timer) 替代 from_timer三、编译驱动在驱动目录下执行（需已安装对应内核头文件，如 linux-headers-$(uname -r)）：cd /path/to/UGREEN_WiFi6_AX300_Driver_Linux_.../aic8800_linux_drvier/drivers/aic8800 make -C /lib/modules/$(uname -r)/build M=$(pwd) modules成功后会生成：aic_load_fw/aic_load_fw.koaic8800_fdrv/aic8800_fdrv.ko四、安装脚本说明原 install_setup.sh 使用 su -c，在无交互终端时无法输入密码。因此新增两个脚本，均在 项目根目录下的 aic8800_linux_drvier 中执行。1. install_with_sudo.sh（安装固件与 udev）复制 fw/aic8800DC 到 /lib/firmware/复制 tools/aic.rules 到 /etc/udev/rules.d/执行 udevadm trigger 与 udevadm control --reload若存在 /dev/aicudisk 等虚拟光驱设备则执行 eject使用：cd /home/fsy/Downloads/UGREEN_WiFi6_AX300_Driver_Linux_CM760-25262_CM761-35263_CM860-75511_V1.6/aic8800_linux_drvier ./install_with_sudo.sh按提示输入 sudo 密码即可。2. load_modules.sh（加载内核模块）先检查 aic_load_fw、aic8800_fdrv 是否已加载（lsmod）未加载则执行 sudo insmod ... 加载对应 .ko若已加载（例如之前装过 aic8800fdrvpackage），会提示“已在运行，跳过”，避免 “File exists” 报错使用：cd /home/fsy/Downloads/UGREEN_WiFi6_AX300_Driver_Linux_CM760-25262_CM761-35263_CM860-75511_V1.6/aic8800_linux_drvier ./load_modules.sh五、推荐操作顺序应用上述源码修改并完成编译（第三节）。在 aic8800_linux_drvier 目录执行：./install_with_sudo.sh。再执行：./load_modules.sh。使用 ip a 或 nmcli device wifi 等确认无线网卡是否出现并可用。六、若通过 deb 包安装若系统之前或之后通过 aic8800fdrvpackage 的 deb 安装，需保证其使用的源码与本次修改一致，或在安装前先移除该包再按本文档从源码编译并安装：sudo dpkg --remove --force-remove-reinstreq aic8800fdrvpackage # 仅当该包导致问题时然后再按第三、四节编译并运行 install_with_sudo.sh 与 load_modules.sh。文档基于当前驱动版本与内核 6.17.0-14-generic 整理。
Cherry Studio 在 WSL 中的安装说明环境WSL2（Ubuntu Noble / 24.04）使用 WSLg 显示图形界面（Windows 11）1. 安装 deb 包cd "/mnt/c/users/12828/desktop/新建文件夹" sudo dpkg -i Cherry-Studio-1.7.19-amd64.deb若出现依赖错误，执行：sudo apt-get update sudo apt-get install -f仍有缺失依赖时可手动安装：sudo apt-get install libnotify4 libnss3 libxss1 xdg-utils libsecret-1-0然后再次执行：sudo dpkg -i Cherry-Studio-1.7.19-amd64.deb2. 声音库（解决 libasound.so.2）Ubuntu 24 中包名为 libasound2t64：sudo apt-get install libasound2t643. 启动方式可执行文件位于 /opt/Cherry Studio/，未加入 PATH，需用完整路径：/opt/Cherry\ Studio/CherryStudio可选：创建软链接，之后可直接用 cherrystudio 命令：sudo ln -sf "/opt/Cherry Studio/CherryStudio" /usr/local/bin/cherrystudio然后：cherrystudio4. 中文显示修复（方框 □□□□）安装中文字体：sudo apt-get install fonts-noto-cjk可选备用：sudo apt-get install fonts-wqy-zenhei安装后关闭并重新打开 Cherry Studio。5. Emoji 显示修复安装 emoji 字体并刷新字体缓存：sudo apt-get install fonts-noto-color-emoji fc-cache -fv可选：sudo apt-get install fonts-emojione fc-cache -fv安装后关闭并重新打开 Cherry Studio。6. 一键安装依赖（可选）若在新 WSL 或新系统上重装，可先执行以下命令再装 deb：sudo apt-get update sudo apt-get install -f libasound2t64 fonts-noto-cjk fonts-noto-color-emoji fc-cache -fv然后再执行本文第 1 步的 dpkg -i。7. 注意事项WSLg：需 Windows 11，WSL 2，图形会直接显示在 Windows 桌面。Windows 10：需在 Windows 安装 X 服务器（如 VcXsrv），并在 WSL 中设置 export DISPLAY=... 后再运行 Cherry Studio。每次修改字体或安装新字体后，建议重启 Cherry Studio 以生效。
基于 Windows 11 + AMD 8060S（统一内存 128GB）环境的llama.cpp 使用指南
llama.cpp 使用指南基于 Windows 11 + AMD 8060S（统一内存 128GB）环境整理。文件下载llama.cpp 程序（含 llama-cli、llama-server）官方 Releases 页面（推荐从这里选对应平台压缩包）： https://github.com/ggml-org/llama.cpp/releasesWindows 常用构建（在当页的 Assets 里找）：Vulkan（AMD 显卡推荐）：llama-*-bin-win-vulkan-x64.zip仅 CPU：llama-*-bin-win-cpu-x64.zipCUDA（NVIDIA）：llama-*-bin-win-cuda-*.zip 不要用 rocm / hip 的 Windows 包，在 Win 上易报错。官网说明： https://llama-cpp.com/GGUF 模型Hugging Face（搜索模型名 + GGUF）： https://huggingface.co/models?search=ggufQwen 官方（如 Qwen3-Coder-Next）： https://huggingface.co/Qwen 在模型页的 "Files and versions" 中选 .gguf 文件或分片包下载。ModelScope 魔搭（国内访问较稳，可搜 GGUF）： https://www.modelscope.cn 模型库中搜索模型名或「GGUF」，在模型页下载 .gguf 或分片。Youtu-VL-4B-Instruct-GGUF（腾讯优图 4B 视觉语言模型）： https://www.modelscope.cn/models/Tencent-YouTu-Research/Youtu-VL-4B-Instruct-GGUF/summary 在模型页「Files」中下载主模型 .gguf；若提供 mmproj-*.gguf 等多模态投影文件，需一并下载并与主模型同目录或按说明指定。Unsloth（预量化 GGUF，含 Dynamic 2.0 等）： https://huggingface.co/unsloth 在 Unsloth 组织下按模型名选仓库，在 "Files and versions" 中下载 GGUF；说明见 https://docs.unsloth.ai。解压 llama.cpp 的 zip 后，将 llama-cli.exe、llama-server.exe 等与模型路径配置好即可使用（见下文）。1. 基本运行1.1 命令行（llama-cli）# 指定模型路径（分片模型只需指定第一个文件，会自动加载其余分片） ./llama-cli.exe -m "E:\models\Qwen3-Coder-Next\Qwen3-Coder-Next\Qwen3-Coder-Next-REAM-MXFP4_MOE.gguf"1.2 强制 CPU（GPU 报错时）./llama-cli.exe -m "你的模型路径.gguf" -ngl 0-ngl 0 表示不加载任何层到 GPU，全部用 CPU。2. Windows 下 GPU 后端说明后端说明ROCm/HIP主要为 Linux 设计，在 Windows 上对新卡（如 gfx1151）支持差，易出现 ROCm error: unspecified launch failure。VulkanAMD 在 Windows 上推荐，需使用带 Vulkan 的 llama.cpp 发行版。CPU-ngl 0，最稳定。若下载的是「Vulkan 版」但日志里仍出现 ROCm/ggml-hip，说明同目录下存在 HIP 相关 DLL 被优先加载。可临时重命名禁用：Rename-Item ggml-hip.dll ggml-hip.dll.bak Rename-Item hipblas.dll hipblas.dll.bak Rename-Item libhipblaslt.dll libhipblaslt.dll.bak然后重新运行，程序会使用 Vulkan。 注意：若本身是 ROCm 专用构建（如路径含 llamacpp-rocm），需从官方 releases 重新下载 Vulkan 或 MSVC 版本，而不是仅改 DLL。3. llama-server 部署3.1 基础启动./llama-server.exe -m "模型路径.gguf" --port 8080 --host 0.0.0.0启动后访问：http://localhost:8080。3.2 常用参数速查参数含义示例-m模型路径必填-c / --ctx-size上下文长度（token 数）-c 2048 或 --ctx-size 32768-ngl放到 GPU 的层数，0=全 CPU-ngl 99 全 GPU，-ngl 0 全 CPU--portHTTP 端口--port 8080--host监听地址，0.0.0.0 允许外网访问--host 0.0.0.0--threadsCPU 线程数--threads 8--batch-size批大小，影响显存/内存512、256、128--ubatch-size微批大小256、128、64--cache-type-kK cache 数据类型，用于省显存f16、q8_0、q4_1--cache-type-vV cache 数据类型同上--flash-attn使用 Flash Attention（若已编译）可省显存--alias模型别名（便于识别）--alias "Qwen3-Coder-Next"4. 显存/内存优化模型体积远小于「显存占用」是正常现象：除了权重，还有 KV cache 和推理时的中间结果。4.1 显存不足（例如 8GB 独显）减小上下文：-c 512 或 -c 1024减少 GPU 层数：-ngl 10 或 -ngl 0（纯 CPU）减小批处理：--batch-size 128 --ubatch-size 64示例（低显存）：./llama-server.exe -m "模型路径.gguf" -c 512 -ngl 10 --port 8080 --threads 6 --batch-size 128 --ubatch-size 644.2 统一内存（如 8060S + 128GB 系统内存）可用较大上下文并尽量用 GPU，同时控制 KV cache 类型以控制总内存占用：使用 f16 KV cache（相对 f32 约减半）：--cache-type-k f16 --cache-type-v f16更激进：--cache-type-k q8_0 --cache-type-v q8_0 或 q4_1按需限制上下文：-c 4096 或 -c 2048示例（统一内存 + 控制占用）：./llama-server.exe -m "模型路径.gguf" -c 4096 -ngl 99 --port 8080 --threads 8 --batch-size 512 --ubatch-size 256 --cache-type-k f16 --cache-type-v f16若仍占用过高，可把上下文改为 -c 2048，并把 cache 改为 q4_1：./llama-server.exe -m "模型路径.gguf" -c 2048 -ngl 99 --port 8080 --threads 8 --batch-size 512 --cache-type-k q4_1 --cache-type-v q4_15. Qwen3-Coder-Next 推荐参数（官方风格）可与上面任意 server 命令组合使用：参数推荐值说明--temp1.0采样温度--top-p0.95nucleus sampling--top-k40top-k 采样--min-p0.01注意：llama.cpp 默认常为 0.05，Qwen 推荐 0.01--repeat-penalty1.0禁用重复惩罚示例（Qwen 推荐 + 内存优化）：./llama-server.exe -m "E:\models\Qwen3-Coder-Next\Qwen3-Coder-Next\Qwen3-Coder-Next-REAM-MXFP4_MOE.gguf" --alias "Qwen3-Coder-Next" --ctx-size 32768 --temp 1.0 --top-p 0.95 --top-k 40 --min-p 0.01 --repeat-penalty 1.0 -ngl 99 --port 8080 --threads 8 --batch-size 512 --cache-type-k q4_1若仍觉内存/显存占用高，可把 --ctx-size 改为 16384 或 8192。6. 故障排查简表现象处理方向ROCm 报错、hipMemGetInfo 失败使用 -ngl 0 或换 Vulkan 版本；在 Windows 避免用 ROCm 专用构建。想用 Vulkan 却仍加载 HIP检查同目录 ggml-hip.dll 等，临时重命名或使用纯 Vulkan 发行版。显存/内存占用远大于模型大小降低 -c、减小 --batch-size/--ubatch-size，使用 --cache-type-k/--cache-type-v（如 q4_1、q8_0、f16）。大模型在小显存卡上跑不动减小 -ngl（或 -ngl 0），或换更小量化/更小参数量模型。7. 参考命令汇总纯 CPU、省内存：./llama-server.exe -m "模型路径.gguf" -c 1024 -ngl 0 --port 8080 --threads 8 --batch-size 256Vulkan GPU + 控制占用（统一内存）：./llama-server.exe -m "模型路径.gguf" -c 4096 -ngl 99 --port 8080 --threads 8 --batch-size 512 --cache-type-k q4_1 --cache-type-v q4_1Qwen3-Coder-Next 推荐 + 32K 上下文：./llama-server.exe -m "E:\models\Qwen3-Coder-Next\Qwen3-Coder-Next\Qwen3-Coder-Next-REAM-MXFP4_MOE.gguf" --alias "Qwen3-Coder-Next" --ctx-size 32768 --temp 1.0 --top-p 0.95 --top-k 40 --min-p 0.01 --repeat-penalty 1.0 -ngl 99 --port 8080 --threads 8 --batch-size 512 --cache-type-k q4_1 --host 0.0.0.0按实际显存/内存和需求，调整 -c、-ngl、--batch-size 和 --cache-type-* 即可。8. Qwen3-Next-80B-A3B-Thinking（Thinking 推理模型）模型说明见 unsloth/Qwen3-Next-80B-A3B-Thinking。仅思维模式，需较长输出空间做推理；官方推荐采样：Temperature=0.6, TopP=0.95, TopK=20, MinP=0；常规请求建议 max 输出 32K token，复杂推理可设更大。推荐启动命令（统一内存 / 大内存）：./llama-server.exe -m "E:\models\Qwen3-Next-80B-A3B\MXFP4_MOE\Qwen3-Next-80B-A3B-Thinking-MXFP4_MOE-00001-of-00003.gguf" --alias "Qwen3-Next-80B-A3B-Thinking" --ctx-size 32768 -n 32768 --temp 0.6 --top-p 0.95 --top-k 20 --min-p 0 -ngl 99 --port 8080 --threads 8 --batch-size 512 --ubatch-size 256 --cache-type-k f16 --cache-type-v f16 --host 0.0.0.0参数取值说明-m分片第一文件路径自动加载 00002、00003--alias服务里显示的模型名客户端选模型时用--ctx-size32768上下文长度，可改为 65536/131072（更吃内存）-n32768单次最大生成 token，thinking 需足够长--temp0.6官方推荐--top-p0.95官方推荐--top-k20官方推荐--min-p0官方推荐-ngl99GPU 层数，显存不够可减小或 -ngl 0 纯 CPU--cache-type-k/vf16省内存，可改为 q4_1 进一步省省内存版（减小上下文与批大小）：./llama-server.exe -m "E:\models\Qwen3-Next-80B-A3B\MXFP4_MOE\Qwen3-Next-80B-A3B-Thinking-MXFP4_MOE-00001-of-00003.gguf" --alias "Qwen3-Next-80B-A3B-Thinking" --ctx-size 16384 -n 16384 --temp 0.6 --top-p 0.95 --top-k 20 --min-p 0 -ngl 99 --port 8080 --threads 8 --batch-size 256 --ubatch-size 128 --cache-type-k q4_1 --cache-type-v q4_19. Youtu-VL-4B-Instruct-GGUF（腾讯优图视觉语言模型）模型页： https://www.modelscope.cn/models/Tencent-YouTu-Research/Youtu-VL-4B-Instruct-GGUF/summary说明：腾讯优图 4B 视觉语言模型（VLM），支持图像 + 文本输入，需 带多模态支持的 llama.cpp。本地路径示例：E:\models\Youtu-VL-4B-Instruct\F16\Youtu-VL-4B-Instruct-F16.gguf 若该模型需 mmproj（多模态投影），将 mmproj-*.gguf 与主模型放同目录，启动时加 --mmproj "同目录\mmproj-xxx.gguf"。推荐启动命令（本地 F16 模型，含 mmproj）：./llama-server.exe -m "E:\models\Youtu-VL-4B-Instruct\F16\Youtu-VL-4B-Instruct-F16.gguf" --mmproj "E:\models\Youtu-VL-4B-Instruct\F16\mmproj-Youtu-VL-4b-Instruct-BF16.gguf" --port 8080 --image-max-tokens 2048 --temp 0.1 --top-p 0.001 --repeat-penalty 1.05 -n 12280 --host 0.0.0.0参数取值说明-m主模型 .gguf 路径必填--mmprojmmproj-*.gguf 路径多模态视觉编码投影，与主模型同目录时按实际文件名填写--port8080HTTP 端口--image-max-tokens2048图像编码最大 token 数--temp0.1低温度，输出更稳定--top-p0.001nucleus 采样--repeat-penalty1.05抑制重复-n12280单次最大生成 token 数--host0.0.0.0允许外网访问按需可加：-ngl 99（GPU 层数）、--alias "Youtu-VL-4B"、-c 4096（上下文长度）。若显存/内存紧张，可减小 -n、-c 或 --image-max-tokens。10. GLM-4.7-Flash（MXFP4_MOE / Claude Opus 4.5 推理蒸馏版）模型页： https://huggingface.co/TeichAI/GLM-4.7-Flash-Claude-Opus-4.5-High-Reasoning-Distill本地路径示例：E:\models\GLM-4.7-Flash\MXFP4_MOE\GLM-4.7-Flash-Claude-4.5-Opus-i1-MXFP4_MOE_XL-exp.gguf说明：智谱 GLM-4.7-Flash 经 Claude Opus 4.5 High Reasoning 蒸馏的 MXFP4 MOE 量化版（Coding / Science / Deep Research）。单文件 GGUF；若为分片，-m 只填第一个文件即可。官方建议 llama.cpp 使用 --min-p 0.01（默认 0.05）。推荐启动命令（含官方采样参数）：./llama-server.exe -m "E:\models\GLM-4.7-Flash\MXFP4_MOE\GLM-4.7-Flash-Claude-4.5-Opus-i1-MXFP4_MOE_XL-exp.gguf" --alias "GLM-4.7-Flash" --ctx-size 32768 --temp 1.0 --top-p 0.95 --min-p 0.01 --repeat-penalty 1.0 -ngl 99 --port 8080 --threads 8 --batch-size 512 --cache-type-k f16 --cache-type-v f16 --host 0.0.0.0参数取值说明-m模型 .gguf 路径必填；分片时填第一个文件--alias服务中显示的模型名客户端选模型用--ctx-size32768上下文长度，可按需改为 16384 等--temp1.0通用任务；工具调用/基准可用 0.7--top-p0.95通用；工具调用可改为 1.0--min-p0.01官方建议（llama.cpp 默认 0.05）--repeat-penalty1.0关闭或 1.0-ngl99GPU 层数，显存不足可减小或 -ngl 0 纯 CPU--port8080HTTP 端口--cache-type-k/vf16省内存，可改为 q4_1 进一步省显存/内存紧张时可将 --ctx-size 改为 16384，--batch-size 改为 256，或加 --cache-type-k q4_1 --cache-type-v q4_1。若效果不佳，可尝试 --temp 0.5 或 0.6。
AMD Ryzen AI MAX+ 395 ROCm WSL2 安装VLLM指南
AMD Ryzen AI MAX+ 395 ROCm WSL2 安装指南硬件信息CPU: AMD Ryzen AI MAX+ PRO 395GPU: AMD Radeon 8060S (40 CU, 32GB 显存)架构: gfx1151安装步骤1. Windows 端安装1.1 安装 AMD 驱动下载最新驱动：https://www.amd.com/en/support/download/drivers.html运行安装程序，选择 "Custom Install"只勾选 "AMD Chipset Drivers"（其他组件不需要）完成安装并重启1.2 安装 Windows SDK下载：https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/安装时只勾选 "Windows SDK for Desktop C++ Apps"记住安装路径（通常是 C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\）1.3 安装 WSL2# 检查 WSL 版本 wsl --version # 如果未安装，运行 wsl --install -d Ubuntu-24.042. WSL2 端安装2.1 进入 WSL2wsl2.2 检查 Ubuntu 版本lsb_release -a # 确认是 Ubuntu 24.042.3 安装 ROCm 7.2# 下载 ROCm 安装器 wget https://repo.radeon.com/amdgpu-install/7.2/ubuntu/noble/amdgpu-install_7.2.70200-1_all.deb # 安装 sudo apt install ./amdgpu-install_7.2.70200-1_all.deb # 更新系统 sudo apt update # 安装依赖 sudo apt install python3-setuptools python3-wheel # 添加用户到 render 和 video 组 sudo usermod -a -G render,video $LOGNAME # 安装 ROCm sudo apt install rocm2.4 验证 ROCm 安装# 检查 ROCm 目录 tree -L 1 /opt # 应该看到 rocm-7.2.0 目录2.5 编译安装 librocdxg安装编译工具sudo apt install cmake git build-essential克隆并编译# 克隆仓库 git clone https://github.com/ROCm/librocdxg.git cd librocdxg # 设置 Windows SDK 路径（根据实际安装路径调整） export win_sdk='/mnt/c/Program Files (x86)/Windows Kits/10/Include/10.0.26100.0/' # 编译 mkdir -p build cd build cmake .. -DWIN_SDK="${win_sdk}/shared" make sudo make install2.6 设置环境变量# 临时设置（当前会话有效） export HSA_ENABLE_DXG_DETECTION=1 # 永久设置（添加到 ~/.bashrc） echo 'export HSA_ENABLE_DXG_DETECTION=1' >> ~/.bashrc source ~/.bashrc2.7 验证 GPU 识别rocminfo预期输出：Agent 1: CPU (AMD RYZEN AI MAX+ PRO 395)Agent 2: GPU (gfx1151, AMD Radeon 8060S, 32GB 显存)3. 使用 ROCm3.1 使用 Docker 容器（推荐）docker run -it \ -v /usr/lib/wsl/lib/libdxcore.so:/usr/lib/libdxcore.so \ -v /opt/rocm/lib/librocdxg.so:/usr/lib/librocdxg.so \ -e HSA_ENABLE_DXG_DETECTION=1 \ --device=/dev/dxg \ --cap-add=SYS_PTRACE \ --security-opt seccomp=unconfined \ --ipc=host \ --shm-size 8G \ rocm/pytorch:latest在容器内测试：import torch print(torch.cuda.is_available()) # 应该返回 True print(torch.cuda.get_device_name(0)) # 显示 GPU 名称3.2 在 WSL2 虚拟环境中安装 PyTorch + vLLM步骤 1：创建工作目录和虚拟环境# 创建工作目录 mkdir -p ~/ai-workspace cd ~/ai-workspace # 创建虚拟环境 python3 -m venv vllm-env预期输出：无输出表示成功# 激活虚拟环境 source vllm-env/bin/activate预期输出：命令提示符前出现 (vllm-env)(vllm-env) fsy@HPAgent:~/ai-workspace$# 验证虚拟环境 which python预期输出：/home/fsy/ai-workspace/vllm-env/bin/python# 升级 pip pip install --upgrade pip预期输出：Successfully installed pip-24.x.x步骤 2：设置环境变量# 临时设置（当前会话有效） export HSA_ENABLE_DXG_DETECTION=1 # 永久设置（推荐） echo 'export HSA_ENABLE_DXG_DETECTION=1' >> ~/.bashrc source ~/.bashrc验证环境变量：echo $HSA_ENABLE_DXG_DETECTION预期输出：1步骤 3：安装 PyTorch（ROCm 7.1）pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm7.1预期输出：Collecting torch Downloading https://download.pytorch.org/whl/rocm7.1/torch-2.10.0%2Brocm7.1-cp312-cp312-linux_x86_64.whl (2.8 GB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.8/2.8 GB 10.5 MB/s eta 0:00:00 ... Successfully installed torch-2.10.0+rocm7.1 torchvision-0.x.x torchaudio-2.x.x注意：下载大小约 2.8-3.5 GB安装时间：5-15 分钟（取决于网速和磁盘速度）如果看起来卡住，可以用 watch -n 1 'du -sh ~/.cache/pip' 查看下载进度步骤 4：验证 PyTorch 和 GPUpython -c "import torch; print(f'PyTorch: {torch.__version__}'); print(f'CUDA available: {torch.cuda.is_available()}'); print(f'GPU: {torch.cuda.get_device_name(0) if torch.cuda.is_available() else \"N/A\"}')"预期输出：PyTorch: 2.10.0+rocm7.1 CUDA available: True GPU: AMD Radeon(TM) 8060S Graphics如果输出不正确：CUDA available: False → 检查环境变量 HSA_ENABLE_DXG_DETECTIONGPU: N/A → 运行 rocminfo 检查 GPU 是否被识别步骤 5：安装 vLLM（从源码编译）# 安装编译依赖 pip install ninja packaging wheel预期输出：Successfully installed ninja-1.x.x packaging-24.x wheel-0.x.x# 克隆 vLLM 仓库 cd ~/ai-workspace git clone https://github.com/vllm-project/vllm.git cd vllm预期输出：Cloning into 'vllm'... remote: Enumerating objects: xxxxx, done. remote: Counting objects: 100% (xxxx/xxxx), done. ...# 1. 先安装构建依赖（--no-build-isolation 时 pip 不会自动装，否则会报 No module named 'setuptools_scm'） pip install "cmake>=3.26.1" ninja "packaging>=24.2" "setuptools>=77.0.3,<81.0.0" "setuptools-scm>=8" wheel "jinja2>=3.1.6" regex build "protobuf>=5.29.6" "grpcio-tools==1.78.0" # 2. 安装 vLLM（编译过程需要 10-20 分钟） # ROCm 必须加 --no-build-isolation，否则 pip 会用临时环境里的 CUDA 版 torch，导致报错 CUDA_HOME is not set pip install -e . --no-build-isolation预期输出：Obtaining file:///.../vllm Checking if build backend supports build_editable ... done ... Building wheels for collected packages: vllm Building wheel for vllm (pyproject.toml) ... done Successfully built vllm Successfully installed vllm-0.16.0rc2.dev276+ge24663c5a.rocm720 ...（最后一行会列出大量依赖；vllm 版本带 rocm720 等后缀表示 ROCm 构建成功，实际版本号随源码与 ROCm 版本变化。）注意：先装构建依赖：使用 --no-build-isolation 时 pip 不会安装 pyproject 里的构建依赖，需先执行上面的 pip install cmake ninja ...，否则会报 ModuleNotFoundError: No module named 'setuptools_scm'。ROCm 安装必须使用 --no-build-isolation：这样会使用当前环境已安装的 ROCm 版 PyTorch 参与构建；若不加，pip 会在临时环境中安装默认（CUDA）版 torch，构建时会报 AssertionError: CUDA_HOME is not set。编译时间：10-20 分钟CPU 使用率会很高（50-100%）如果编译失败，检查是否有足够的内存（建议 8GB+）步骤 6：验证 vLLMpython -c "import vllm; print(f'vLLM version: {vllm.__version__}')"预期输出（示例）：vLLM version: 0.16.0rc2.dev276+ge24663c5a.rocm720步骤 7：测试 vLLM 推理（可选）创建测试脚本 test_vllm.py：from vllm import LLM, SamplingParams # 加载小模型测试 print("Loading model...") llm = LLM(model="facebook/opt-125m") # 生成文本 print("Generating text...") prompts = ["Hello, my name is"] sampling_params = SamplingParams(temperature=0.8, top_p=0.95, max_tokens=20) outputs = llm.generate(prompts, sampling_params) print("\nResults:") for output in outputs: print(f"Prompt: {output.prompt}") print(f"Generated: {output.outputs[0].text}")运行测试：python test_vllm.py预期输出：Loading model... INFO: Initializing an LLM engine with config: ... Generating text... Results: Prompt: Hello, my name is Generated: John Smith and I am a software engineer...步骤 8：启动 vLLM API 服务器（可选）# 启动 API 服务器（单 GPU） python -m vllm.entrypoints.api_server \ --model facebook/opt-125m \ --dtype float16 \ --port 8000预期输出：INFO: Started server process [xxxxx] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8000测试 API（另开终端）：curl http://localhost:8000/generate \ -H "Content-Type: application/json" \ -d '{"prompt": "What is AMD?", "max_tokens": 50}'预期输出：{"text":["What is AMD?\nAMD (Advanced Micro Devices) is a semiconductor company that designs and manufactures computer processors..."]}常见问题问题 1：虚拟环境移动后无法安装包error: externally-managed-environment解决方案：虚拟环境不能移动，必须重新创建deactivate rm -rf ~/ai-workspace/vllm-env cd ~/ai-workspace python3 -m venv vllm-env source vllm-env/bin/activate # 重新安装 PyTorch（有缓存，很快） pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm7.1问题 2：PyTorch 安装卡住解决方案：查看下载进度# 另开终端 watch -n 1 'du -sh ~/.cache/pip'如果确实卡住：# Ctrl+C 取消 pip cache purge pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm7.1 --timeout 1000 -v问题 3：vLLM 编译失败解决方案：检查内存和依赖# 检查可用内存 free -h # 如果内存不足，增加 swap sudo fallocate -l 8G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # 重新编译（ROCm 需加 --no-build-isolation；若报 setuptools_scm 等缺失，先执行上文「安装 vLLM」里的构建依赖安装命令） pip install -e . --no-build-isolation版本信息WSL 版本: 2.6.3.0Ubuntu: 24.04 LTSROCm: 7.2librocdxg: 1.1.0AMD 驱动: 26.2.1 或更新版本PyTorch: 2.x（ROCm 7.1 版本）vLLM: 最新版本兼容性根据官方文档，支持以下 Ryzen AI 系列：AMD Ryzen AI Max+ 395 ✅AMD Ryzen AI Max 390AMD Ryzen AI Max 385AMD Ryzen AI 9 HX 375AMD Ryzen AI 9 HX 370AMD Ryzen AI 9 365参考资料ROCm 官方文档: https://rocm.docs.amd.com/librocdxg GitHub: https://github.com/ROCm/librocdxgAMD 驱动下载: https://www.amd.com/en/support/download/drivers.htmlWindows SDK: https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/故障排除GPU 未识别# 检查环境变量 echo $HSA_ENABLE_DXG_DETECTION # 检查设备节点 ls -la /dev/dxg # 重新加载 WSL # 在 PowerShell 中运行 wsl --shutdown wslDocker 容器无法访问 GPU确保运行容器时包含所有必需参数：--device=/dev/dxg-v /usr/lib/wsl/lib/libdxcore.so:/usr/lib/libdxcore.so-v /opt/rocm/lib/librocdxg.so:/usr/lib/librocdxg.so-e HSA_ENABLE_DXG_DETECTION=1安装日期: 2026-02-18测试状态: ✅ 成功识别 GPU，ROCm 正常工作
PostgreSQL 安装和使用指南目录概述安装 PostgreSQL基本配置启动和停止服务用户和权限管理数据库操作表和数据操作备份和恢复性能调优基础常用命令总结故障排除概述PostgreSQL 是一个功能强大的开源关系型数据库管理系统，支持 SQL 标准，并提供了许多现代特性，如复杂查询、外键、触发器、视图、事务完整性等。主要特性ACID 事务支持多版本并发控制 (MVCC)支持多种数据类型可扩展的类型系统丰富的索引类型全文搜索JSON 和 JSONB 支持存储过程和函数安装 PostgreSQL在 Ubuntu/Debian 上安装# 更新包列表 sudo apt update # 安装 PostgreSQL sudo apt install postgresql postgresql-contrib # 检查版本 psql --version在 CentOS/RHEL 上安装# 安装 PostgreSQL 仓库 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm # 安装 PostgreSQL sudo yum install -y postgresql15-server postgresql15-contrib # 初始化数据库 sudo /usr/pgsql-15/bin/postgresql-15-setup initdb # 启动服务 sudo systemctl start postgresql-15 sudo systemctl enable postgresql-15在 macOS 上安装# 使用 Homebrew 安装 brew install postgresql # 启动服务 brew services start postgresql使用 Docker 安装# 拉取 PostgreSQL 镜像 docker pull postgres:15 # 运行容器 docker run --name postgres-db -e POSTGRES_PASSWORD=mypassword -e POSTGRES_DB=mydb -p 5432:5432 -d postgres:15基本配置配置文件位置PostgreSQL 的主要配置文件通常位于：/etc/postgresql/15/main/postgresql.conf (Ubuntu/Debian)/var/lib/pgsql/15/data/postgresql.conf (CentOS/RHEL)/usr/local/var/postgres/postgresql.conf (macOS with Homebrew)常用配置参数# 监听地址 (默认只监听本地) listen_addresses = '*' # 端口 (默认 5432) port = 5432 # 最大连接数 max_connections = 100 # 共享缓冲区大小 (设置为系统内存的 25%) shared_buffers = 256MB # 工作内存 work_mem = 4MB # 维护工作内存 maintenance_work_mem = 64MB # 检查点间隔 checkpoint_completion_target = 0.9 # WAL 日志级别 wal_level = replica # 最大 WAL 发送者进程数 max_wal_senders = 10修改配置后重启服务# Ubuntu/Debian sudo systemctl restart postgresql # CentOS/RHEL sudo systemctl restart postgresql-15 # macOS brew services restart postgresql启动和停止服务系统服务管理# 启动服务 sudo systemctl start postgresql # 停止服务 sudo systemctl stop postgresql # 重启服务 sudo systemctl restart postgresql # 查看状态 sudo systemctl status postgresql # 开机自启 sudo systemctl enable postgresql手动启动# 切换到 postgres 用户 sudo -u postgres -i # 启动 PostgreSQL pg_ctl -D /var/lib/postgresql/15/main start # 停止 PostgreSQL pg_ctl -D /var/lib/postgresql/15/main stop用户和权限管理切换到 postgres 用户sudo -u postgres psql # 或者 sudo su - postgres psql创建用户-- 创建普通用户 CREATE USER username WITH PASSWORD 'password'; -- 创建超级用户 CREATE USER admin WITH SUPERUSER PASSWORD 'password'; -- 创建用户并指定权限 CREATE USER app_user WITH PASSWORD 'password' CREATEDB CREATEROLE;修改用户密码-- 修改密码 ALTER USER username PASSWORD 'new_password'; -- 强制修改密码 (下次登录时) ALTER USER username PASSWORD NULL;删除用户DROP USER username;角色和权限-- 创建角色 CREATE ROLE readonly; -- 授予权限 GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly; -- 撤销权限 REVOKE SELECT ON ALL TABLES IN SCHEMA public FROM readonly; -- 授予数据库连接权限 GRANT CONNECT ON DATABASE mydb TO username; -- 授予表权限 GRANT SELECT, INSERT, UPDATE, DELETE ON table_name TO username;数据库操作创建数据库-- 创建数据库 CREATE DATABASE mydb; -- 创建数据库并指定所有者 CREATE DATABASE mydb OWNER username; -- 创建数据库并指定编码 CREATE DATABASE mydb OWNER username ENCODING 'UTF8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8' TEMPLATE template0;连接数据库# 使用 psql 连接 psql -h localhost -U username -d mydb # 或者直接连接默认数据库 psql -U username mydb列出数据库-- 列出所有数据库 \l -- 或者 SELECT datname FROM pg_database;删除数据库-- 删除数据库 (需要超级用户权限) DROP DATABASE mydb;表和数据操作创建表-- 创建简单表 CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(255) UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 创建带有外键的表 CREATE TABLE posts ( id SERIAL PRIMARY KEY, user_id INTEGER REFERENCES users(id), title VARCHAR(200) NOT NULL, content TEXT, published_at TIMESTAMP );数据类型数据类型描述示例SERIAL自增整数id SERIALINTEGER整数age INTEGERVARCHAR(n)可变长度字符串name VARCHAR(100)TEXT无限长度文本content TEXTBOOLEAN布尔值active BOOLEANTIMESTAMP时间戳created_at TIMESTAMPDATE日期birth_date DATENUMERIC(p,s)精确数值price NUMERIC(10,2)JSONBJSON 数据metadata JSONB插入数据-- 插入单行数据 INSERT INTO users (name, email) VALUES ('张三', 'zhangsan@example.com'); -- 插入多行数据 INSERT INTO users (name, email) VALUES ('李四', 'lisi@example.com'), ('王五', 'wangwu@example.com'); -- 插入并返回数据 INSERT INTO users (name, email) VALUES ('赵六', 'zhaoliu@example.com') RETURNING id, name, email;查询数据-- 查询所有数据 SELECT * FROM users; -- 选择特定列 SELECT name, email FROM users; -- 带条件查询 SELECT * FROM users WHERE name LIKE '张%'; -- 排序 SELECT * FROM users ORDER BY created_at DESC; -- 分页 SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20; -- 聚合查询 SELECT COUNT(*) FROM users; SELECT AVG(age) FROM users WHERE age IS NOT NULL; -- 连接查询 SELECT u.name, p.title FROM users u JOIN posts p ON u.id = p.user_id;更新数据-- 更新单行 UPDATE users SET name = '张三新' WHERE id = 1; -- 更新多行 UPDATE users SET active = true WHERE created_at < '2024-01-01'; -- 更新并返回 UPDATE users SET email = 'newemail@example.com' WHERE id = 1 RETURNING id, name, email;删除数据-- 删除特定行 DELETE FROM users WHERE id = 1; -- 删除所有数据 DELETE FROM users; -- 清空表 (保留表结构) TRUNCATE TABLE users;索引-- 创建索引 CREATE INDEX idx_users_email ON users(email); CREATE INDEX idx_users_name ON users(name); -- 创建唯一索引 CREATE UNIQUE INDEX idx_users_unique_email ON users(email); -- 创建复合索引 CREATE INDEX idx_posts_user_published ON posts(user_id, published_at); -- 查看索引 SELECT * FROM pg_indexes WHERE tablename = 'users'; -- 删除索引 DROP INDEX idx_users_email;备份和恢复使用 pg_dump 备份# 备份整个数据库 pg_dump -U username -h localhost mydb > backup.sql # 备份压缩格式 pg_dump -U username -h localhost -Fc mydb > backup.dump # 备份特定表 pg_dump -U username -h localhost -t users mydb > users_backup.sql # 只备份数据 pg_dump -U username -h localhost --data-only mydb > data_only.sql # 只备份结构 pg_dump -U username -h localhost --schema-only mydb > schema_only.sql使用 pg_restore 恢复# 从 SQL 文件恢复 psql -U username -h localhost -d mydb < backup.sql # 从压缩文件恢复 pg_restore -U username -h localhost -d mydb backup.dump # 创建数据库并恢复 createdb -U username newdb pg_restore -U username -h localhost -d newdb backup.dump逻辑备份脚本#!/bin/bash # 自动备份脚本 BACKUP_DIR="/var/backups/postgresql" DATE=$(date +%Y%m%d_%H%M%S) DB_NAME="mydb" DB_USER="postgres" mkdir -p $BACKUP_DIR pg_dump -U $DB_USER -h localhost -Fc $DB_NAME > $BACKUP_DIR/${DB_NAME}_${DATE}.dump # 删除7天前的备份 find $BACKUP_DIR -name "*.dump" -mtime +7 -delete echo "Backup completed: ${DB_NAME}_${DATE}.dump"物理备份 (使用 pg_basebackup)# 创建基础备份 pg_basebackup -U postgres -h localhost -D /var/lib/postgresql/backup -Fp -Xs -P # 恢复时停止服务，清理数据目录，复制备份文件，重启服务性能调优基础查看系统状态-- 查看当前连接 SELECT * FROM pg_stat_activity; -- 查看表大小 SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) as size FROM pg_tables ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC; -- 查看索引使用情况 SELECT schemaname, tablename, indexname, idx_scan, idx_tup_read, idx_tup_fetch FROM pg_stat_user_indexes ORDER BY idx_scan DESC; -- 查看慢查询 SELECT query, calls, total_time, mean_time, rows FROM pg_stat_statements ORDER BY total_time DESC LIMIT 10;配置参数调优# 内存配置 shared_buffers = 256MB # 通常设置为系统内存的 25% work_mem = 4MB # 单个查询可用的内存 maintenance_work_mem = 64MB # 维护操作内存 effective_cache_size = 1GB # 操作系统缓存大小 # 检查点配置 checkpoint_completion_target = 0.9 wal_buffers = 16MB max_wal_size = 1GB min_wal_size = 80MB # 查询规划器 random_page_cost = 1.1 # SSD 设为 1.1，HDD 设为 4.0 effective_io_concurrency = 200 # SSD 设为 200，HDD 设为 2索引优化-- 查看未使用的索引 SELECT schemaname, tablename, indexname FROM pg_stat_user_indexes WHERE idx_scan = 0; -- 查看重复索引 SELECT pg_size_pretty(sum(pg_relation_size(indexrelid))) as size, array_agg(indexrelid::regclass) as indexes FROM pg_index GROUP BY indrelid, indkey HAVING count(*) > 1; -- EXPLAIN 分析查询 EXPLAIN ANALYZE SELECT * FROM users WHERE name = '张三';表优化-- 重新组织表 (VACUUM) VACUUM users; -- 完全清理表 VACUUM FULL users; -- 重新建立索引 REINDEX TABLE users; -- 分析表统计信息 ANALYZE users;常用命令总结psql 命令# 连接数据库 psql -U username -d dbname -h host -p port # 执行 SQL 文件 psql -U username -d dbname -f file.sql # 导出查询结果 psql -U username -d dbname -c "SELECT * FROM users" -o output.txtpsql 内部命令-- 帮助 \? -- 列出数据库 \l -- 切换数据库 \c dbname -- 列出表 \dt -- 描述表结构 \d table_name -- 列出用户 \du -- 查看查询历史 \s -- 执行操作系统命令 \! ls -la -- 退出 \q系统管理命令# 查看 PostgreSQL 进程 ps aux | grep postgres # 查看日志 tail -f /var/log/postgresql/postgresql-15-main.log # 检查配置文件语法 postgres -C config_file # 重新加载配置 pg_ctl reload -D /var/lib/postgresql/15/main故障排除常见问题连接被拒绝检查服务是否启动：sudo systemctl status postgresql检查监听地址配置检查防火墙设置权限不足-- 检查用户权限 SELECT * FROM information_schema.role_table_grants WHERE grantee = 'username'; -- 授予权限 GRANT ALL PRIVILEGES ON DATABASE mydb TO username;磁盘空间不足-- 查看数据库大小 SELECT pg_size_pretty(pg_database_size('mydb')); -- 查看表大小 SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) FROM pg_tables ORDER BY pg_total_relation_size DESC LIMIT 10;查询性能问题-- 启用查询统计 CREATE EXTENSION IF NOT EXISTS pg_stat_statements; -- 查看慢查询 SELECT query, calls, total_time/calls as avg_time FROM pg_stat_statements ORDER BY total_time DESC LIMIT 5;恢复数据库# 停止服务 sudo systemctl stop postgresql # 清理数据目录 sudo rm -rf /var/lib/postgresql/15/main/* # 从备份恢复 sudo -u postgres pg_restore -C -d postgres /path/to/backup.dump # 启动服务 sudo systemctl start postgresql监控和维护-- 查看当前活动连接 SELECT datname, usename, client_addr, state, query_start FROM pg_stat_activity WHERE state != 'idle'; -- 查看锁定情况 SELECT blocked_locks.pid as blocked_pid, blocked_activity.usename as blocked_user, blocking_locks.pid as blocking_pid, blocking_activity.usename as blocking_user, blocked_activity.query as blocked_statement FROM pg_locks blocked_locks JOIN pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid JOIN pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype AND blocking_locks.database IS NOT DISTINCT FROM blocked_locks.database AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid AND blocking_locks.pid != blocked_locks.pid JOIN pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid WHERE NOT blocked_locks.granted;扩展和插件-- 查看已安装扩展 SELECT * FROM pg_extension; -- 安装常用扩展 CREATE EXTENSION IF NOT EXISTS pg_stat_statements; -- 查询统计 CREATE EXTENSION IF NOT EXISTS uuid-ossp; -- UUID 支持 CREATE EXTENSION IF NOT EXISTS postgis; -- 地理信息支持 CREATE EXTENSION IF NOT EXISTS pg_trgm; -- 模糊匹配这个指南涵盖了 PostgreSQL 的基本安装、配置、使用和维护。如果你在使用过程中遇到特定问题，请提供详细的错误信息以获得更精确的帮助。
Linux 中新增用户的方法目录1. 使用 useradd 命令（推荐）1.1 基本语法1.2 常用选项1.3 示例2. 使用 adduser 命令（交互式，Debian/Ubuntu）2.1 基本用法2.2 特点2.3 示例3. 创建用户后的必要操作3.1 设置密码3.2 赋予 sudo 权限（可选）3.3 验证用户创建3.4 用户主目录管理3.4.1 创建用户主目录3.4.2 复制默认配置文件到主目录3.4.3 修改用户主目录3.4.4 设置主目录权限3.4.5 查看用户主目录3.5 设置登录时的默认账号3.5.1 设置默认登录用户（图形界面）3.5.1.1 使用 systemd 的自动登录（systemd 系统）3.5.1.2 使用 LightDM（Ubuntu/Linux Mint）3.5.1.3 使用 GDM（GNOME 显示管理器）3.5.1.4 使用 SDDM（KDE Plasma）3.5.2 设置默认 Shell3.5.3 设置默认用户组3.5.4 设置默认环境变量3.5.5 设置默认工作目录3.5.6 配置 SSH 默认登录用户3.5.7 设置系统默认用户（系统服务）3.5.8 禁用自动登录（安全考虑）4. 切换用户的方法4.1 使用 su 命令4.1.1 基本语法4.1.2 常用选项4.1.3 示例4.2 使用 sudo 命令4.2.1 基本语法4.2.2 切换到其他用户4.3 使用 sudo -i 命令4.4 使用 sudo -s 命令4.5 退出切换的用户4.6 查看当前用户4.7 su 和 sudo 的区别4.8 实际应用场景4.8.1 临时切换到 root 执行管理任务4.8.2 切换到普通用户测试4.8.3 以其他用户身份运行服务4.9 安全注意事项5. 完整创建用户流程示例5.1 使用 useradd 的完整流程5.2 使用 adduser 的完整流程6. 高级选项6.1 指定用户 ID 范围6.2 创建用户时指定多个附加组6.3 设置用户过期时间7. 相关配置文件7.1 用户信息文件7.2 默认设置文件8. 删除用户8.1 删除用户但保留主目录8.2 删除用户及其主目录9. 修改用户信息9.1 使用 usermod 命令10. 注意事项11. 常见问题排查11.1 用户无法登录11.2 查看用户所属组11.3 查看所有用户1. 使用 useradd 命令（推荐）1.1 基本语法useradd [选项] 用户名1.2 常用选项-m 或 --create-home: 创建用户主目录-d 或 --home-dir HOME_DIR: 指定用户主目录路径-s 或 --shell SHELL: 指定用户的默认 shell-g 或 --gid GROUP: 指定用户的主要组-G 或 --groups GROUPS: 指定用户的附加组（多个组用逗号分隔）-u 或 --uid UID: 指定用户 ID-c 或 --comment COMMENT: 添加用户注释（通常是全名）1.3 示例# 创建用户并自动创建主目录 sudo useradd -m username # 创建用户并指定 shell sudo useradd -m -s /bin/bash username # 创建用户并指定主目录 sudo useradd -m -d /home/customdir username # 创建用户并指定组 sudo useradd -m -g users -G sudo,www-data username # 创建用户并指定 UID sudo useradd -m -u 1001 username # 创建用户并添加注释 sudo useradd -m -c "User Full Name" username2. 使用 adduser 命令（交互式，Debian/Ubuntu）2.1 基本用法sudo adduser username2.2 特点交互式创建用户自动创建主目录自动设置密码自动创建同名组提示输入用户信息（全名、房间号、工作电话等）2.3 示例# 交互式创建用户 sudo adduser username # 非交互式创建用户（跳过提示） sudo adduser --disabled-password --gecos "" username3. 创建用户后的必要操作3.1 设置密码# 使用 passwd 命令设置密码 sudo passwd username3.2 赋予 sudo 权限（可选）# 方法1: 添加到 sudo 组 sudo usermod -aG sudo username # 方法2: 编辑 sudoers 文件 sudo visudo # 添加以下行： # username ALL=(ALL:ALL) ALL3.3 验证用户创建# 查看用户信息 id username # 查看用户详细信息 finger username # 如果安装了 finger getent passwd username3.4 用户主目录管理3.4.1 创建用户主目录# 创建用户时自动创建主目录（推荐） sudo useradd -m username # 如果创建用户时没有创建主目录，手动创建 sudo mkdir -p /home/username sudo chown username:username /home/username sudo chmod 755 /home/username3.4.2 复制默认配置文件到主目录# 复制默认配置文件（.bashrc, .profile 等） sudo cp /etc/skel/.bashrc /home/username/ sudo cp /etc/skel/.profile /home/username/ sudo cp -r /etc/skel/. /home/username/ # 设置正确的所有者和权限 sudo chown -R username:username /home/username sudo chmod -R 755 /home/username3.4.3 修改用户主目录# 修改用户主目录路径 sudo usermod -d /new/home/path username # 移动现有主目录到新位置 sudo mv /home/username /new/home/path sudo chown -R username:username /new/home/path3.4.4 设置主目录权限# 设置主目录权限（只有所有者可访问） sudo chmod 700 /home/username # 设置主目录权限（所有者可读写执行，组和其他用户无权限） sudo chmod 755 /home/username # 递归设置主目录下所有文件权限 sudo chmod -R 700 /home/username sudo chown -R username:username /home/username3.4.5 查看用户主目录# 查看用户主目录路径 grep username /etc/passwd | cut -d: -f6 # 或者使用 getent getent passwd username | cut -d: -f6 # 查看主目录详细信息 ls -ld ~username ls -la /home/username3.5 设置登录时的默认账号3.5.1 设置默认登录用户（图形界面）3.5.1.1 使用 systemd 的自动登录（systemd 系统）# 编辑自动登录配置 sudo nano /etc/systemd/logind.conf # 找到并修改以下行（取消注释并设置） # NAutoVTs=6 # ReserveVT=6 # KillUserProcesses=no # 编辑 getty 服务配置 sudo systemctl edit getty@tty1.service # 添加以下内容： [Service] ExecStart= ExecStart=-/sbin/agetty --autologin username --noclear %I $TERM3.5.1.2 使用 LightDM（Ubuntu/Linux Mint）# 编辑 LightDM 配置文件 sudo nano /etc/lightdm/lightdm.conf # 在 [Seat:*] 部分添加： autologin-user=username autologin-user-timeout=03.5.1.3 使用 GDM（GNOME 显示管理器）# 编辑 GDM 配置文件 sudo nano /etc/gdm3/custom.conf # 在 [daemon] 部分添加： AutomaticLogin=username AutomaticLoginEnable=true3.5.1.4 使用 SDDM（KDE Plasma）# 编辑 SDDM 配置文件 sudo nano /etc/sddm.conf # 添加以下内容： [Autologin] User=username Session=plasma.desktop3.5.2 设置默认 Shell# 创建用户时指定默认 shell sudo useradd -m -s /bin/bash username # 修改现有用户的默认 shell sudo chsh -s /bin/bash username # 或者使用 usermod sudo usermod -s /bin/bash username # 查看可用的 shell cat /etc/shells # 查看用户的当前 shell grep username /etc/passwd | cut -d: -f73.5.3 设置默认用户组# 创建用户时指定主要组 sudo useradd -m -g users username # 修改用户的主要组 sudo usermod -g groupname username # 查看用户的组信息 groups username id username3.5.4 设置默认环境变量# 编辑用户的 .bashrc 文件 nano ~/.bashrc # 或者编辑全局配置文件 sudo nano /etc/bash.bashrc sudo nano /etc/profile # 添加环境变量示例： export PATH=$PATH:/usr/local/bin export EDITOR=nano export LANG=zh_CN.UTF-83.5.5 设置默认工作目录# 在用户的 .bashrc 中添加 cd /path/to/default/directory # 或者在 .profile 中添加 cd $HOME/projects3.5.6 配置 SSH 默认登录用户# 编辑 SSH 客户端配置 nano ~/.ssh/config # 添加以下内容： Host myserver HostName server.example.com User username Port 22 IdentityFile ~/.ssh/id_rsa # 这样可以直接使用：ssh myserver3.5.7 设置系统默认用户（系统服务）# 查看系统默认用户设置 cat /etc/default/useradd # 编辑默认设置 sudo nano /etc/default/useradd # 常见配置项： # GROUP=100 # 默认组 ID # HOME=/home # 默认主目录位置 # INACTIVE=-1 # 密码过期后的宽限天数 # EXPIRE= # 账户过期日期 # SHELL=/bin/bash # 默认 shell # SKEL=/etc/skel # 骨架目录 # CREATE_MAIL_SPOOL=yes # 是否创建邮件目录3.5.8 禁用自动登录（安全考虑）# 移除自动登录配置 sudo nano /etc/lightdm/lightdm.conf # 注释掉或删除 autologin-user 行 # 或者 sudo nano /etc/gdm3/custom.conf # 注释掉或删除 AutomaticLogin 行 # 重启显示管理器 sudo systemctl restart lightdm # 或 sudo systemctl restart gdm34. 切换用户的方法4.1 使用 su 命令4.1.1 基本语法su [选项] [用户名]4.1.2 常用选项- 或 -l 或 --login: 完全登录（加载目标用户的环境变量）-c 或 --command: 以目标用户身份执行单个命令-s 或 --shell: 指定要使用的 shell-m 或 -p 或 --preserve-environment: 保持当前环境变量4.1.3 示例# 切换到 root 用户（需要输入 root 密码） su # 切换到 root 用户并加载完整环境 su - # 切换到指定用户 su username # 切换到指定用户并加载完整环境 su - username # 以目标用户身份执行单个命令 su -c "command" username # 切换到用户并保持当前环境变量 su -m username4.2 使用 sudo 命令4.2.1 基本语法sudo [选项] 命令4.2.2 切换到其他用户# 切换到 root 用户（需要当前用户有 sudo 权限） sudo su # 切换到 root 用户并加载完整环境 sudo su - # 切换到指定用户 sudo su username # 切换到指定用户并加载完整环境 sudo su - username # 以指定用户身份执行命令 sudo -u username command4.3 使用 sudo -i 命令# 切换到 root 用户并启动交互式登录 shell sudo -i # 切换到指定用户并启动交互式登录 shell sudo -i -u username4.4 使用 sudo -s 命令# 切换到 root 用户并启动 shell（不加载完整环境） sudo -s # 切换到指定用户并启动 shell sudo -s -u username4.5 退出切换的用户# 退出当前用户会话，返回到之前的用户 exit # 或者使用快捷键 Ctrl + D4.6 查看当前用户# 查看当前登录的用户名 whoami # 查看当前用户 ID id # 查看当前用户详细信息 id -a # 查看所有登录的用户 who # 查看当前用户和切换历史 w4.7 su 和 sudo 的区别特性susudo密码要求需要目标用户的密码需要当前用户的密码权限控制切换到目标用户后拥有其所有权限可以精细控制权限审计日志基本日志详细的审计日志安全性需要共享 root 密码更安全，不需要共享密码使用场景完全切换用户身份临时提升权限执行命令4.8 实际应用场景4.8.1 临时切换到 root 执行管理任务# 方法1: 使用 sudo（推荐） sudo command # 方法2: 使用 su su -c "command" # 方法3: 切换到 root 后执行 sudo su - # 执行命令 # exit4.8.2 切换到普通用户测试# 从 root 切换到普通用户 su - username # 从普通用户切换到另一个普通用户（需要目标用户密码） su - username4.8.3 以其他用户身份运行服务# 以 www-data 用户运行命令 sudo -u www-data command # 以 postgres 用户运行命令 sudo -u postgres psql4.9 安全注意事项避免使用 su 切换到 root: 推荐使用 sudo 而不是 su，因为：不需要共享 root 密码有详细的审计日志可以精细控制权限使用 sudo 的最佳实践:# 只执行需要的命令，而不是切换到 root sudo command # 推荐 # 避免长时间以 root 身份运行 sudo su - # 不推荐，除非必要限制 sudo 权限: 在 /etc/sudoers 中只授予必要的权限使用 sudo 超时: sudo 默认在 15 分钟内记住密码，超时需要重新输入5. 完整创建用户流程示例5.1 使用 useradd 的完整流程# 1. 创建用户 sudo useradd -m -s /bin/bash -c "John Doe" john # 2. 设置密码 sudo passwd john # 3. 添加到 sudo 组（可选） sudo usermod -aG sudo john # 4. 验证 id john5.2 使用 adduser 的完整流程# 一步完成（交互式） sudo adduser john # 按提示输入密码和信息即可6. 高级选项6.1 指定用户 ID 范围# 查看当前系统用户 ID 范围 grep UID_MIN /etc/login.defs grep UID_MAX /etc/login.defs # 创建系统用户（UID < 1000） sudo useradd -r -s /bin/false systemuser6.2 创建用户时指定多个附加组sudo useradd -m -G sudo,docker,www-data username6.3 设置用户过期时间# 使用 chage 命令 sudo chage -E 2024-12-31 username7. 相关配置文件7.1 用户信息文件/etc/passwd: 用户账户信息/etc/shadow: 用户密码信息（加密）/etc/group: 组信息/etc/gshadow: 组密码信息7.2 默认设置文件/etc/login.defs: 用户创建的默认设置/etc/default/useradd: useradd 的默认配置8. 删除用户8.1 删除用户但保留主目录sudo userdel username8.2 删除用户及其主目录sudo userdel -r username9. 修改用户信息9.1 使用 usermod 命令# 修改用户 shell sudo usermod -s /bin/zsh username # 修改用户主目录 sudo usermod -d /new/home/path username # 修改用户组 sudo usermod -g newgroup username # 添加附加组 sudo usermod -aG groupname username # 锁定用户账户 sudo usermod -L username # 解锁用户账户 sudo usermod -U username10. 注意事项权限要求: 创建用户需要 root 权限，使用 sudo 或切换到 root 用户用户名规则:只能包含小写字母、数字、下划线和连字符不能以连字符开头通常建议使用小写字母主目录: 使用 -m 选项确保创建主目录，否则用户无法正常登录Shell 设置: 确保指定的 shell 存在于 /etc/shells 文件中系统用户 vs 普通用户:系统用户通常 UID < 1000，用于运行服务普通用户 UID >= 1000，用于登录系统11. 常见问题排查11.1 用户无法登录# 检查用户 shell 是否正确 grep username /etc/passwd # 检查主目录是否存在 ls -la /home/username # 检查主目录权限 sudo chown -R username:username /home/username11.2 查看用户所属组groups username id username11.3 查看所有用户# 查看所有用户 cat /etc/passwd # 只查看普通用户（UID >= 1000） awk -F: '$3 >= 1000 {print $1}' /etc/passwd总结:Debian/Ubuntu 系统: 推荐使用 adduser（更简单）其他 Linux 发行版: 使用 useradd（更灵活）创建后记得设置密码和必要的权限