news 2026/8/19 18:51:16

手把手教你用QEMU在Ubuntu 20.04上创建最小系统(含网络配置和软件源优化)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手教你用QEMU在Ubuntu 20.04上创建最小系统(含网络配置和软件源优化)

构建极致精简的Ubuntu系统:QEMU实战与深度调优指南

在资源日益宝贵的今天,无论是边缘计算设备、持续集成环境,还是开发者的本地沙箱,一个占用空间小、启动迅速、功能纯粹的操作系统镜像都显得弥足珍贵。Ubuntu以其庞大的软件生态和社区支持著称,但其标准桌面或服务器镜像动辄数GB的体积,在很多场景下显得过于“臃肿”。这时,从零开始构建一个最小化Ubuntu系统,就成了一项极具价值的技术实践。

这不仅仅是下载一个精简版镜像那么简单。真正的“最小系统”构建,意味着你完全掌控了系统从内核空间到用户空间的每一个组件,能够按需裁剪,只保留最核心的服务和库。对于嵌入式开发者,这是将应用部署到资源受限硬件的必经之路;对于云原生工程师,这是打造高效容器基础镜像的底层技能;对于安全研究员,这是分析系统行为和潜在漏洞的纯净沙盒。而QEMU,这个强大的开源机器模拟器,为我们提供了一个完美的、无风险的构建与测试平台。它允许我们在x86_64的主机上,模拟运行ARM64、RISC-V等多种架构的系统,极大地扩展了最小系统的应用边界。

本文将带你超越简单的步骤罗列,深入探讨如何在Ubuntu 20.04 LTS(Focal Fossa)宿主环境下,利用QEMU构建一个高度定制化的ARM64最小系统。我们将不仅完成从rootfs解压到系统启动的全过程,更会聚焦于网络配置的底层原理软件源的科学选择与优化策略,以及系统服务与安全性的深度调优。目标是交付一个不仅“能用”,而且“高效、安全、可维护”的精品系统镜像。

1. 环境准备与核心概念解析

在动手之前,理解我们即将使用的工具链和核心概念至关重要。这能帮助你在遇到问题时,不仅知道“怎么做”,更明白“为什么这么做”。

QEMU是一个通用的、开源的机器模拟器和虚拟化器。当我们在x86电脑上运行ARM程序时,QEMU的用户态模拟(qemu-user-*)扮演了关键角色。它像一个“翻译官”,在运行时将ARM指令动态翻译成x86指令,使得ARM二进制文件能够无缝地在我们的主机上执行。这正是我们能够chroot进入一个ARM架构的根文件系统并进行操作的基础。

Ubuntu Base则是我们构建的基石。它不是一个完整的操作系统,而是一个最小的、可启动的根文件系统(rootfs),仅包含aptsystemd(或upstart)、bash等最基础的组件,大小通常只有几十MB。你可以将其理解为一个毛坯房,后续的所有软件包、配置和个性化设置,都需要我们在这个基础上亲手搭建。

1.1 宿主系统与工具安装

首先,确保你的宿主系统是Ubuntu 20.04或更高版本。打开终端,更新软件包列表并安装必要的工具。

sudo apt update sudo apt upgrade -y

接下来,安装QEMU用户态模拟器和一些辅助工具。binfmt-support这个包非常重要,它能让Linux内核自动识别非本机架构的二进制文件,并调用对应的QEMU模拟器来执行。

sudo apt install -y qemu-user-static qemu-system-arm binfmt-support

使用以下命令验证qemu-aarch64-static是否安装成功,并查看其版本信息:

which qemu-aarch64-static qemu-aarch64-static --version

提示:qemu-user-staticqemu-user的区别在于,static版本是静态链接的二进制文件,不依赖宿主系统的动态库,因此可以直接拷贝到目标根文件系统中使用,这对于构建跨架构环境至关重要。

1.2 获取与解压Ubuntu Base根文件系统

我们将从Ubuntu官方镜像站获取ARM64架构的Base镜像。选择20.04 LTS版本是因为其长期支持的特性和稳定的软件生态。

# 创建一个干净的工作目录 mkdir -p ~/qemu-ubuntu-minimal && cd ~/qemu-ubuntu-minimal # 下载 Ubuntu 20.04 LTS (Focal Fossa) 的 ARM64 base 镜像 wget http://cdimage.ubuntu.com/ubuntu-base/releases/20.04/release/ubuntu-base-20.04.5-base-arm64.tar.gz # 验证文件完整性(可选但推荐) wget http://cdimage.ubuntu.com/ubuntu-base/releases/20.04/release/SHA256SUMS sha256sum -c SHA256SUMS 2>/dev/null | grep ubuntu-base-20.04.5-base-arm64.tar.gz

下载完成后,创建并解压根文件系统:

# 创建根文件系统目录 sudo mkdir rootfs # 解压tar包到rootfs目录 # 注意保持文件权限,因此使用sudo sudo tar -xzf ubuntu-base-20.04.5-base-arm64.tar.gz -C rootfs

解压后,rootfs目录下应该出现了bin,etc,usr等标准的Linux根目录结构。这个目录现在就是我们的“目标系统”的雏形。

2. 搭建跨架构Chroot环境

要让宿主系统能够执行目标根文件系统里的ARM64程序,我们需要将QEMU的静态模拟器二进制文件放入其中,并配置好一些必要的绑定挂载。

2.1 注入QEMU模拟器

将静态编译的QEMU AArch64模拟器复制到目标系统的/usr/bin目录下:

sudo cp /usr/bin/qemu-aarch64-static rootfs/usr/bin/

这个操作是整个过程的核心魔法。当我们在chroot环境下尝试运行一个ARM64的/bin/bash时,内核的binfmt_misc机制会识别出其ARM64的ELF格式,然后自动调用我们放置在rootfs/usr/bin/qemu-aarch64-static来执行它。

2.2 配置网络与系统挂载脚本

chroot之前,需要解决两个问题:网络和系统文件访问。

网络配置:为了让chroot环境能够解析域名,我们需要将宿主机的DNS配置复制进去。同时,备份原有的配置以防万一。

# 备份目标系统原有的resolv.conf sudo mv rootfs/etc/resolv.conf rootfs/etc/resolv.conf.bak 2>/dev/null || true # 复制宿主机的DNS配置 sudo cp /etc/resolv.conf rootfs/etc/

创建智能挂载脚本chroot环境需要访问/proc,/sys,/dev等虚拟文件系统才能正常工作。手动挂载和卸载很繁琐,且容易出错。下面是一个增强版的挂载脚本,它更健壮,并包含了错误处理。

在工作目录下创建ch-mount.sh文件:

#!/bin/bash set -e # 遇到错误立即退出 ROOTFS_DIR="$1" SCRIPT_NAME=$(basename "$0") function mnt() { echo "[INFO] Mounting necessary filesystems into $ROOTFS_DIR..." # 检查目录是否存在 if [ ! -d "$ROOTFS_DIR" ]; then echo "[ERROR] Directory $ROOTFS_DIR does not exist." >&2 exit 1 fi # 绑定挂载 /dev, /proc, /sys # 使用 `-o bind` 或 `--bind` 保持兼容性 sudo mount --bind /dev "${ROOTFS_DIR}/dev" sudo mount -t proc /proc "${ROOTFS_DIR}/proc" sudo mount -t sysfs /sys "${ROOTFS_DIR}/sys" sudo mount --bind /dev/pts "${ROOTFS_DIR}/dev/pts" # 对于 systemd 系统,有时需要 /run,但并非必须 if [ -d /run ]; then sudo mount --bind /run "${ROOTFS_DIR}/run" 2>/dev/null || echo "[WARN] Could not bind /run, continuing..." fi echo "[INFO] Mounts completed." } function umnt() { echo "[INFO] Unmounting filesystems from $ROOTFS_DIR..." # 以LIFO(后进先出)顺序安全卸载 for mount_point in run sys/firmware sys/fs/cgroup sys proc dev/pts dev; do if mountpoint -q "${ROOTFS_DIR}/${mount_point}" 2>/dev/null; then sudo umount -l "${ROOTFS_DIR}/${mount_point}" 2>/dev/null && echo " Unmounted ${mount_point}" fi done # 最后尝试卸载 /sys 和 /proc 根目录 for mount_point in sys proc dev; do if mountpoint -q "${ROOTFS_DIR}/${mount_point}" 2>/dev/null; then sudo umount -l "${ROOTFS_DIR}/${mount_point}" 2>/dev/null && echo " Unmounted ${mount_point}" fi done echo "[INFO] Unmounts completed." } # 主逻辑 if [ $# -ne 1 ]; then echo "Usage: sudo $SCRIPT_NAME <rootfs_directory>" echo "Example: sudo $SCRIPT_NAME ./rootfs" exit 1 fi # 检查是否以root权限运行(或通过sudo) if [ "$EUID" -ne 0 ]; then echo "[ERROR] Please run this script as root or using sudo." >&2 exit 1 fi # 执行挂载 mnt "$ROOTFS_DIR" echo "" echo "[INFO] Entering chroot environment. Type 'exit' to leave and automatically unmount." echo "========================================" # 进入chroot,设置一些基本的环境变量 sudo chroot "$ROOTFS_DIR" /bin/bash -c "export LC_ALL=C; export DEBIAN_FRONTEND=noninteractive; exec /bin/bash" echo "========================================" echo "[INFO] Exited chroot. Cleaning up..." # 执行卸载 umnt "$ROOTFS_DIR"

赋予脚本执行权限并运行:

sudo chmod +x ch-mount.sh sudo ./ch-mount.sh ./rootfs

如果一切顺利,你的终端提示符会变成类似root@ubuntu:/#的样子,恭喜,你已经进入了全新的ARM64 Ubuntu最小系统环境!

3. 系统初始化与软件源深度优化

进入chroot环境后,我们面对的是一个极其精简的系统。首要任务是配置软件源并安装最基本的工具,为后续的定制化铺平道路。

3.1 基础环境与软件源配置

chroot环境中,首先设置语言环境,避免apt操作出现警告。

export LC_ALL=C export DEBIAN_FRONTEND=noninteractive

更新软件包列表前,我们必须先替换默认的软件源。Ubuntu Base镜像里的源地址通常是ports.ubuntu.com,对于国内用户来说速度可能不理想。选择一个合适的镜像源能极大提升效率。

注意:由于我们构建的是ARM64架构的系统,必须使用支持ubuntu-ports的镜像源。许多常见的镜像站(如阿里云、腾讯云)都提供ubuntu-ports仓库。

备份原有源列表,然后用你喜欢的编辑器(这里先用cat创建,因为vimnano还没安装)创建新的sources.list文件:

cd /etc/apt cp sources.list sources.list.backup cat > sources.list << 'EOF' # 清华大学 Ubuntu-ports 镜像源 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse # 如需源码包,取消下面行的注释 # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse EOF

除了清华源,你也可以根据地理位置选择其他优秀的镜像站。下表对比了几个常用镜像源的特点:

镜像源提供商地址格式特点推荐指数
清华大学 TUNAhttps://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/国内速度极快,同步及时,社区活跃★★★★★
中科大 USTChttps://mirrors.ustc.edu.cn/ubuntu-ports/历史悠久,稳定性好,带宽充足★★★★★
阿里云https://mirrors.aliyun.com/ubuntu-ports/商业公司维护,CDN网络优秀★★★★☆
华为云https://repo.huaweicloud.com/ubuntu-ports/新兴镜像,速度表现不俗★★★★☆
官方源http://ports.ubuntu.com/ubuntu-ports/最权威,但国内访问可能较慢★★☆☆☆

更新软件包列表并安装第一批基础工具:

apt update apt install -y nano curl wget sudo apt-transport-https ca-certificates

安装ca-certificates是为了确保HTTPS源的证书验证正常,apt-transport-https则是访问HTTPS源所必需的。

3.2 核心软件包选型与安装策略

一个“最小系统”的“最小”是相对的,取决于你的用途。以下是针对不同场景的核心软件包选型建议,你可以按需组合安装。

1. 开发与构建环境基础包:

apt install -y build-essential git cmake pkg-config gdb
  • build-essential: 包含gcc, g++, make等编译工具链。
  • git: 版本控制。
  • cmake&pkg-config: 现代C/C++项目构建和依赖查找。

2. 系统管理与诊断工具:

apt install -y htop iotop net-tools iproute2 dnsutils lsof strace
  • htop/iotop: 交互式资源监控。
  • net-tools&iproute2: 新旧两代网络配置工具(ifconfigvsip)。
  • lsof&strace: 查看进程打开文件及系统调用追踪,调试利器。

3. 网络与服务必备:

apt install -y openssh-server rsyslog cron
  • openssh-server: 允许远程登录。
  • rsyslog: 系统日志服务。
  • cron: 定时任务服务。

4. 容器与云原生基础:如果你构建的系统将作为容器基础镜像或轻量级Kubernetes节点,可以考虑:

apt install -y systemd-container dbus uidmap # 注意:在极简环境中,需谨慎评估systemd的额外开销。

一个平衡了实用性和体积的“通用最小服务器”安装命令如下,它包含了上述多个类别的核心组件:

apt install -y \ sudo vim-tiny curl wget net-tools iproute2 \ htop lsof strace psmisc \ openssh-server rsyslog cron \ systemd-sysv dbus \ language-pack-en-base

注意:language-pack-en-base可以避免后续安装其他软件时出现语言环境相关的警告。vim-tiny是vim的极简版本,比完整的vim节省大量空间。

安装完成后,运行apt autoremove --purgeapt clean来清理下载的缓存包,这是保持镜像精简的好习惯。

apt autoremove --purge -y apt clean rm -rf /var/lib/apt/lists/*

4. 系统定制、网络与安全加固

系统软件就绪后,我们需要对其进行个性化定制和加固,使其从一个通用的基础镜像转变为一个安全、可用的独立系统。

4.1 用户、主机名与基础配置

创建非root用户:永远不要使用root进行日常操作,这是最基本的安全准则。

# 创建一个主用户,例如 ‘admin’,并加入sudo组 useradd -m -s /bin/bash -G sudo admin # 为用户设置密码 echo 'admin:YourSecurePassword123!' | chpasswd # 或者使用交互式方式: passwd admin # 同时,也建议为root设置一个强密码 passwd root

设置主机名

echo 'ubuntu-minimal-arm64' > /etc/hostname # 同时在hosts文件中添加对应条目,确保本地解析正常 echo '127.0.1.1 ubuntu-minimal-arm64' >> /etc/hosts

修复sudo权限:在某些情况下,从tar包解压出来的/usr/bin/sudo文件权限可能不正确,导致无法使用sudo。可以检查并修复:

chmod 4755 /usr/bin/sudo ls -l /usr/bin/sudo # 正确输出应为:-rwsr-xr-x 1 root root ...

4.2 网络配置:Netplan实战

Ubuntu 18.04以后,网络配置默认由Netplan管理。它使用YAML格式的配置文件,比传统的/etc/network/interfaces更清晰。我们的最小系统需要配置网络,以便在QEMU全系统模拟或移植到真实硬件时能自动获取IP。

创建或编辑Netplan配置文件。通常位于/etc/netplan/目录下,文件名可以是01-netcfg.yaml

cat > /etc/netplan/01-netcfg.yaml << 'EOF' network: version: 2 renderer: networkd ethernets: eth0: dhcp4: true dhcp6: false # 如需静态IP,注释dhcp4,使用以下配置: # addresses: # - 192.168.1.100/24 # gateway4: 192.168.1.1 # nameservers: # addresses: [8.8.8.8, 1.1.1.1] EOF

这个配置告诉系统:

  • 使用systemd-networkd作为后端渲染器(renderer: networkd),这在无GUI的最小系统中是最高效的。
  • 对于网络接口eth0,启用IPv4的DHCP自动获取。
  • 禁用IPv6的DHCP(dhcp6: false),如果你需要IPv6,可以改为true

应用配置并测试:

# 在chroot环境中,Netplan的apply命令可能无法直接生效, # 因为真正的网络设备不存在。但生成配置是必要的。 netplan generate # 这个命令会验证配置语法,并在 /run 下生成后端所需的配置。

4.3 服务管理与安全考量

SSH服务配置:如果安装了openssh-server,建议进行一些安全加固。

# 备份原始配置 cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup # 使用sed进行关键修改,或直接用编辑器编辑 sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config # 建议在真实部署后,禁用密码登录,改用密钥认证 # sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config

时区设置

# 设置时区为上海(亚洲/上海) ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime echo 'Asia/Shanghai' > /etc/timezone

禁用不必要的服务:在最小系统中,每个运行的服务都消耗资源。查看并禁用你绝对不需要的服务。

# 列出所有可用的服务单元 systemctl list-unit-files --type=service | grep enabled # 例如,如果你不需要蓝牙(在服务器环境中),可以禁用(但需先安装对应包) # systemctl disable bluetooth.service

chroot环境中,systemctldisable/enable命令主要是在文件系统层面创建或删除符号链接,为真实启动做准备。

完成所有配置后,退出chroot环境:

exit

退出后,之前创建的ch-mount.sh脚本会自动卸载所有绑定挂载。

5. 镜像打包、QEMU启动与性能调优

现在,我们拥有了一个配置好的根文件系统目录。接下来需要将其打包成可用于QEMU启动或烧录的磁盘镜像,并学习如何启动它。

5.1 创建可启动的EXT4磁盘镜像

直接使用目录虽然方便,但最终部署通常需要的是一个独立的镜像文件。我们创建一个EXT4格式的镜像文件。

首先,估算rootfs目录的大小,以便决定镜像容量:

sudo du -sh rootfs/

假设输出是450M。我们预留一些增长空间,创建一个600MB的镜像。

# 1. 创建一个空镜像文件 dd if=/dev/zero of=ubuntu-minimal.img bs=1M count=600 # 2. 格式化为ext4文件系统 mkfs.ext4 -F ubuntu-minimal.img # 3. 创建挂载点并挂载 mkdir -p /mnt/minimal-img sudo mount -o loop ubuntu-minimal.img /mnt/minimal-img # 4. 将rootfs目录的所有内容复制到镜像中 sudo cp -a rootfs/* /mnt/minimal-img/ # 5. 卸载镜像 sudo umount /mnt/minimal-img

镜像空间优化:使用cp -a复制后,镜像文件可能并未被完全填满。我们可以使用e2fsckresize2fs来检查和收缩镜像到最小所需大小,但这有一定风险。更稳妥的做法是在创建镜像时精确预估大小,或者在首次启动系统后,在系统内部进行扩容操作。

5.2 使用QEMU系统模式启动

之前我们用的是qemu-user-static进行用户态模拟和chroot。现在,我们要用qemu-system-aarch64进行完整的虚拟机系统模拟,这需要内核和引导程序。

获取UEFI固件(可选):对于ARM64虚拟机,QEMU通常使用edk2-aarch64作为UEFI固件。在Ubuntu上可以安装:

sudo apt install -y qemu-efi-aarch64

这会将固件文件(如/usr/share/qemu-efi-aarch64/QEMU_EFI.fd)安装到系统中。

获取Linux内核:我们需要一个ARM64的Linux内核。最简单的方法是使用Ubuntu官方为ARM64云镜像预编译的内核。

# 下载内核和initrd wget http://ports.ubuntu.com/ubuntu-ports/dists/focal-updates/main/installer-arm64/current/legacy-images/netboot/initrd.gz wget http://ports.ubuntu.com/ubuntu-ports/dists/focal-updates/main/installer-arm64/current/legacy-images/netboot/vmlinuz

编写启动脚本:创建一个启动脚本run-qemu.sh,将镜像、内核、固件等参数组合起来。

#!/bin/bash KERNEL="./vmlinuz" INITRD="./initrd.gz" DISK_IMG="./ubuntu-minimal.img" # 如果安装了qemu-efi-aarch64,通常路径如下 EFI_FIRMWARE="/usr/share/qemu-efi-aarch64/QEMU_EFI.fd" # 检查文件是否存在 for file in "$KERNEL" "$INITRD" "$DISK_IMG"; do if [ ! -f "$file" ]; then echo "Error: Required file $file not found!" >&2 exit 1 fi done qemu-system-aarch64 \ -machine virt \ -cpu cortex-a57 \ -m 1024 \ -smp 2 \ -kernel "$KERNEL" \ -initrd "$INITRD" \ -append "root=/dev/vda1 console=ttyAMA0 rw" \ -drive if=none,file="$DISK_IMG",format=raw,id=hd0 \ -device virtio-blk-device,drive=hd0 \ -netdev user,id=net0,hostfwd=tcp::2222-:22 \ -device virtio-net-device,netdev=net0 \ -nographic

这个脚本做了以下配置:

  • -machine virt: 使用QEMU的ARM“virt”通用平台。
  • -cpu cortex-a57: 指定CPU模型。
  • -m 1024: 分配1GB内存。
  • -smp 2: 分配2个CPU核心。
  • -kernel/-initrd: 指定内核和初始内存盘。
  • -append: 内核参数,指定根设备为/dev/vda1,使用串口控制台。
  • -drive: 将我们的磁盘镜像作为第一块虚拟硬盘(vda)附加。
  • -netdev/-device: 配置用户模式网络,并将宿主机的2222端口转发到虚拟机的22端口(SSH),方便远程登录。
  • -nographic: 不使用图形界面,将串口输出到当前终端。

赋予脚本执行权限并运行:

chmod +x run-qemu.sh ./run-qemu.sh

如果一切配置正确,虚拟机将启动,并可能进入内核引导过程。由于我们使用的是安装器的内核和initrd,它可能会尝试进入安装界面。要真正启动我们自定义的根文件系统,我们需要一个与根文件系统匹配的、更精简的内核。更高级的做法是编译自定义内核,或者从已运行的最小系统中提取内核模块和内核镜像,但这超出了本文基础范围。一种实用的替代方案是直接使用宿主系统(如果也是ARM64)的内核,或者使用为特定硬件板预编译的内核。

5.3 性能调优与存储优化

构建最小系统的最终目的是追求性能和效率。除了选择轻量级软件包,还可以在文件系统和运行时层面进行优化。

文件系统选择:EXT4是通用选择,但对于只读或频繁读写的特定场景,可以考虑:

  • SquashFS: 极高的压缩比,只读,常用于Live CD和容器层。
  • OverlayFS: 联合文件系统,常用于Docker,节省写时复制(CoW)的开销。

使用systemd分析启动时间:在系统启动后,可以分析哪些服务拖慢了启动过程。

# 在虚拟机内执行 systemd-analyze blame systemd-analyze critical-chain

根据分析结果,禁用非关键的服务(如apt-daily-upgrade.timer,systemd-timesyncd.service如果不需要NTP)。

调整apt配置以减少磁盘I/O:在/etc/apt/apt.conf.d/下创建配置文件,可以禁用不必要的索引和缓存。

cat > /etc/apt/apt.conf.d/99-minimal << 'EOF # 不存储缓存包文件 Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache ""; # 禁用安装推荐和建议的包 APT::Install-Recommends "false"; APT::Install-Suggests "false"; # 自动清理已下载的包文件 APT::Keep-Downloaded-Packages "false"; EOF

构建一个最小Ubuntu系统并使其高效运行,是一个融合了系统理解、软件选型和实践技巧的持续过程。从最初的rootfs解压,到跨架构环境的搭建,再到软件源的优化、服务的裁剪和安全加固,每一步都影响着最终系统的品质。使用QEMU作为构建和测试平台,为我们提供了无与伦比的灵活性和安全性。当你第一次通过自己构建的镜像成功启动一个系统,并看到那精简而高效的登录提示符时,这种对系统底层控制的成就感,正是驱动我们不断深入技术细节的动力。记住,最小的系统不是终点,而是你完全掌控的起点。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 16:24:52

Win11重装不求人:联想小新Air15 2021版U盘启动与BIOS设置详解

联想小新Air15 2021版&#xff1a;从零到一&#xff0c;亲手构建你的Windows 11纯净系统 手里这台联想小新Air15 2021版&#xff0c;陪伴你度过了不少日夜&#xff0c;但系统似乎越来越“臃肿”&#xff0c;开机慢了&#xff0c;偶尔还蓝屏&#xff0c;或者你刚给它升级了一块大…

作者头像 李华
网站建设 2026/7/14 16:24:51

Ubuntu指纹登录避坑指南:Synaptics驱动更新与PAM认证配置

Ubuntu指纹登录避坑指南&#xff1a;Synaptics驱动更新与PAM认证配置 在追求极致效率与安全性的现代工作流中&#xff0c;指纹登录早已不是锦上添花的功能&#xff0c;而是提升日常操作流畅度的关键一环。对于许多选择Ubuntu作为主力开发或生产环境的ThinkPad用户而言&#xff…

作者头像 李华
网站建设 2026/7/14 16:25:03

CLIP ViT-H-14企业级应用:基于LAION-2B的工业质检图像相似度分析

CLIP ViT-H-14企业级应用&#xff1a;基于LAION-2B的工业质检图像相似度分析 1. 引言&#xff1a;当工业质检遇到AI视觉 想象一下&#xff0c;在一条高速运转的生产线上&#xff0c;成千上万的零件正被快速生产出来。质检员需要像鹰一样&#xff0c;用肉眼去识别每一个微小的…

作者头像 李华
网站建设 2026/7/14 16:25:01

Qwen3-VL-2B输出格式控制?结构化回答生成技巧

Qwen3-VL-2B输出格式控制&#xff1f;结构化回答生成技巧 你是不是也遇到过这种情况&#xff1a;上传一张图片给AI&#xff0c;问它“这张图里有什么&#xff1f;”&#xff0c;结果它给你回复了一大段密密麻麻的文字&#xff0c;信息是有了&#xff0c;但读起来费劲&#xff…

作者头像 李华
网站建设 2026/7/14 16:25:02

AI Agent技能自进化实战解析,从经验沉淀到持续成长

在大模型应用飞速普及的今天&#xff0c;AI Agent已经能够胜任网页导航、深度研究、多轮对话交互等各类复杂任务&#xff0c;成为提升生产效率、简化复杂流程的核心工具。但随着应用场景的不断深入&#xff0c;一个关键瓶颈逐渐凸显&#xff1a;大多数Agent虽然能够积累海量的历…

作者头像 李华