最近折腾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 2 3 4 5 6 7 8 9 |
# 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. 初始化配置
安装完成后,进入系统:
|
1 |
wsl -d Alpine-Custom |
建议先更新软件源(推荐清华源或阿里云源)并安装基础工具:
|
1 2 3 4 5 6 |
# 替换为清华源 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 端)
|
1 |
winget install usbipd |
2. 绑定并连接
插入 TF 卡,在管理员 PowerShell 中执行:
|
1 2 3 4 5 6 7 8 |
# 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 -l或lsblk完全找不到新硬盘(也就是没有/dev/sdX)。
原因:
Alpine 为了追求极简,默认没有自动加载 USB 存储相关的内核模块。虽然物理连接通了,但操作系统不知道怎么读写它。
解决方法
在 Alpine 终端中,我们需要手动“推”一下内核,加载驱动:
|
1 2 3 4 5 |
# 手动加载核心存储模块 modprobe usb-storage # 基础 USB 存储驱动 modprobe uas # USB Attached SCSI (较新的读卡器通常需要) modprobe scsi_mod # SCSI 核心模块 modprobe sd_mod # SCSI 磁盘驱动 (负责生成 /dev/sd* 设备节点) |
加载完毕后,查看内核日志验证:
|
1 |
dmesg | tail -n 10 |
此时你应该能看到类似 [sdc] Attached SCSI removable disk 的成功日志,这说明 /dev/sdc 终于出现了。
第四阶段:挂载与修改
确认设备名后(假设为 /dev/sdc,数据通常在第二个分区):
|
1 2 3 4 5 6 7 8 |
# 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 2 3 4 5 6 7 8 |
# 1. 回到主目录 cd ~ # 2. 强制将内存数据刷入磁盘 (双重保险) sync # 3. 卸载分区 umount /mnt/tf |
2. Windows 端断开连接
回到 Windows 的管理员 PowerShell,断开 WSL 对设备的占用:
|
1 2 |
# 这里的 BUSID 要和你之前 attach 的一致 usbipd detach --busid 2-13 |
3. 物理拔出
此时 Windows 会重新识别到该 USB 设备。点击任务栏右下角的 “安全删除硬件”,等待提示安全后再拔出读卡器。
⚠️ 警示:如果在 Windows 弹窗提示“你需要格式化磁盘才能使用”时,千万点击“取消”!这是 Windows 不认识 ext4 的正常反应,点了格式化数据就没了。