最近折腾R2S,手残把接口配置改挂了,只好拔卡直接操作文件,因为只有Windows,tf卡里是ext4,不想安装其他软件,最后决定采用WSL2+Alpine,相比 Ubuntu 动辄几百 MB 的体积,Alpine 的 Mini Root Filesystem 只有几 MB,启动秒开~  经历了一次从 手动导入 Alpine Rootfs解决 USB 挂载驱动缺失 的完整折腾过程。

本文记录了两个核心坑点,希望能帮到同样遇到 wsl --mount 报错的朋友:

  • 如何通过 wsl --import 安装官网下载的 rootfs.tar.gz
  • (重点) 如何解决 Alpine 在 WSL2 下默认不加载 USB 存储驱动,导致 usbipd 连接成功却找不到磁盘的问题。

第一阶段:手动安装 Alpine (Mini Root Filesystem)

虽然 Microsoft Store 里有现成的 Alpine,但我更习惯直接使用官方的 rootfs 包,这样可以完全控制安装路径和版本,也能确保系统的纯净。

1. 下载 Rootfs

前往 Alpine 官方下载页:https://alpinelinux.org/downloads/
找到 MINI ROOT FILESYSTEM 一栏,下载 x86_64 架构的 tar.gz 包(例如 alpine-minirootfs-3.23.3-x86_64.tar.gz)。

2. 导入 WSL (Import)

打开 Windows 管理员 PowerShell,创建一个存放系统的目录,然后使用 wsl --import 命令进行安装。

  • DistroName: 发行版名称,例如 Alpine-Custom
  • InstallLocation: 安装位置(vhdx 文件的存放地)
  • InstallTarFile: 刚才下载的压缩包路径
# 1. 创建安装目录
mkdir D:\WSL\Alpine-Custom

# 2. 导入系统
# 语法: wsl --import <名称> <安装路径> <rootfs包路径>
wsl --import Alpine-Custom D:\WSL\Alpine-Custom C:\Downloads\alpine-minirootfs-3.19.1-x86_64.tar.gz

# 3. 验证是否安装成功
wsl -l -v

3. 初始化配置

安装完成后,进入系统:

wsl -d Alpine-Custom

建议先更新软件源(推荐清华源或阿里云源)并安装基础工具:

# 替换为清华源
sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories

# 更新并安装 usbutils (排查 USB 问题必备)
apk update
apk add usbutils util-linux

第二阶段:遇到的问题与 USB 透传方案

为什么不用 wsl –mount?

WSL2 官方提供了 wsl --mount 命令来挂载物理磁盘。但我尝试挂载 TF 卡时,遇到了经典报错:

Error code: Wsl/Service/AttachDisk/MountDisk/HCS/0x8007000f
无法将磁碟 '\\.\PHYSICALDRIVE1' 連結到 WSL2: 系统找不到指定的驱动器。

这通常是因为廉价读卡器的驱动层实现问题,或者 Windows 对移动存储设备的独占锁定,导致 WSL 无法以“块设备”形式直接挂载。

解决方案:USBIPD (USB 透传)

我们需要把读卡器从 Windows “拔”下来,直接“插”进 WSL 的内核里。

1. 安装工具 (Windows 端)

winget install usbipd

2. 绑定并连接
插入 TF 卡,在管理员 PowerShell 中执行:

# 1. 列出设备,找到读卡器的 BUSID (例如 2-13)
usbipd list

# 2. 绑定设备 (如果状态不是 Shared)
usbipd bind --busid 2-13

# 3. 连接到 WSL (注意:此时需保持 Alpine 窗口开启)
usbipd attach --wsl --busid 2-13

第三阶段:解决 Alpine 驱动缺失的“隐形”问题 (关键)

这是最容易卡住的地方。

现象

  • 在 Windows 端显示 Attached
  • 在 Alpine 里用 lsusb 能看到 Generic Mass Storage 设备。
  • 但是!fdisk -llsblk 完全找不到新硬盘(也就是没有 /dev/sdX)。

原因
Alpine 为了追求极简,默认没有自动加载 USB 存储相关的内核模块。虽然物理连接通了,但操作系统不知道怎么读写它。

解决方法

在 Alpine 终端中,我们需要手动“推”一下内核,加载驱动:

# 手动加载核心存储模块
modprobe usb-storage  # 基础 USB 存储驱动
modprobe uas          # USB Attached SCSI (较新的读卡器通常需要)
modprobe scsi_mod     # SCSI 核心模块
modprobe sd_mod       # SCSI 磁盘驱动 (负责生成 /dev/sd* 设备节点)

加载完毕后,查看内核日志验证:

dmesg | tail -n 10

此时你应该能看到类似 [sdc] Attached SCSI removable disk 的成功日志,这说明 /dev/sdc 终于出现了。


第四阶段:挂载与修改

确认设备名后(假设为 /dev/sdc,数据通常在第二个分区):

# 1. 创建挂载点
mkdir -p /mnt/tf

# 2. 挂载 ext4 分区
mount /dev/sdc2 /mnt/tf

# 3. 检查内容
ls -la /mnt/tf

现在,你可以像操作本地磁盘一样,随意修改 TF 卡里的文件了。


第五阶段:安全弹出与数据保护 (必读)

Linux 的 ext4 文件系统大量使用内存缓存(Buffer)。如果不规范卸载,刚才修改的内容可能根本没写进卡里,甚至导致分区表损坏。

请严格按照以下 “三步走” 流程操作:

1. Alpine 内部卸载

切记先 cd 离开挂载点,否则会提示 target is busy

# 1. 回到主目录
cd ~

# 2. 强制将内存数据刷入磁盘 (双重保险)
sync

# 3. 卸载分区
umount /mnt/tf

2. Windows 端断开连接

回到 Windows 的管理员 PowerShell,断开 WSL 对设备的占用:

# 这里的 BUSID 要和你之前 attach 的一致
usbipd detach --busid 2-13

3. 物理拔出

此时 Windows 会重新识别到该 USB 设备。点击任务栏右下角的 “安全删除硬件”,等待提示安全后再拔出读卡器。

**⚠️ 警示:**如果在 Windows 弹窗提示“你需要格式化磁盘才能使用”时,千万点击“取消”!这是 Windows 不认识 ext4 的正常反应,点了格式化数据就没了。