WSL2 跨系统文件移动

快速使用可以直接看 Chapter 1(移动文件)

和我一样的新手建议按顺序阅读:3(路径教学)→ 4(rsync vs cp)→ 5(rsync 详解)→ 1(移动文件) ,遇到I/O error看 2(I/O error 解决)


目录

  1. WSL2 → Windows 外接移动硬盘(J:)移动文件:步骤与命令 【本文以移动硬盘(J:)为例】
  2. I/O error(Input/output error)的判断与解决步骤
  3. 路径教学(什么时候用绝对 / 相对 / ~ / ./ / ../
  4. rsynccp 的区别(面向大文件 / 跨系统场景)
  5. rsync 详解:常用参数与实例(含移动硬盘、断点续传、排除等)
    附:后台运行 rsync 的小脚本、快速检查清单、mount/umount 解释

1. WSL2 → Windows 外接移动硬盘 (J:):如何判断能否访问并移动

重要步骤(安全第一):先确认 Windows 能识别 J:,然后在 WSL 中确认 /mnt/j 可读写,再选择复制或同步命令(推荐 rsync)。

本文以linux下 /root/pathology/rawdata复制到 windows移动硬盘 (J:)为例

1.1 Windows 层检查

在 Windows 资源管理器或"此电脑"确认盘符 J: 存在且能正常打开。

1.2 WSL 中检查挂载

在 WSL(Ubuntu 等)中运行:

bash 复制代码
# 查看 /mnt 下挂载情况
ls -l /mnt
# 检查 J 盘内容
ls -l /mnt/j
# 或查看挂载信息
mount | grep -i '/mnt/j\|drvfs'

正常 :能看到目录内容;mount 显示 J: on /mnt/j type drvfs (rw,...)
异常ls: cannot access '/mnt/j': Input/output error → 表示挂载或 I/O 出错(见第 2 节)。

1.3 推荐操作(复制 vs 移动)

  • 推荐先复制(安全)

    bash 复制代码
    # 复制目录(递归)
    cp -r /root/pathology/rawdata /mnt/j/
    # 更推荐 rsync(进度、断点续传)
    rsync -avh --progress /root/pathology/rawdata/ /mnt/j/rawdata/
  • 不建议直接 mv(跨文件系统 mv 实际是复制 + 删除,风险更高)

    bash 复制代码
    mv /root/pathology/rawdata /mnt/j/   # 可以,但风险:操作中断可能导致数据丢失
    # 更稳妥的做法
    cp -r /root/pathology/rawdata /mnt/j/
  • 检查内容是否复制完整

    bash 复制代码
    # 快速检查差异(基于文件大小)
    rsync -rvn --size-only /root/pathology/rawdata/ /mnt/j/rawdata/
    # 没有输出任何文件名即提示内容大小一致
  • 如果发现不一致,重新运行也可跳过前述检查步骤直接运行(会自动检测)

    bash 复制代码
    rsync -avh --progress /root/pathology/rawdata/ /mnt/j/rawdata/
  • 确认后删除源

    bash 复制代码
    rm -rf /root/pathology/rawdata

1.4 root 权限导致访问问题

若源在 /root 或需要权限:

bash 复制代码
sudo cp -r /root/pathology/rawdata /mnt/j/
#或
sudo rsync -avh --progress /root/pathology/rawdata/ /mnt/j/rawdata/

1.5 如果 /mnt/j 只读(ro)

查看挂载标志:

bash 复制代码
mount | grep j

若确认只读,可尝试重新挂载(需 sudo):

bash 复制代码
sudo umount /mnt/j
sudo mount -t drvfs J: /mnt/j -o metadata,uid=$(id -u),gid=$(id -g)

注意:当系统处于 I/O 挂死时 sudo 可能也失败,见第 2 节说明的恢复步骤。

mountumount简介见 附2


2. Input/output error(I/O error)诊断与解决

场景 :复制/rsync 时突然拔盘、USB 断电或设备睡眠,导致 WSL 报 Input/output error,连 sudo 也出错。

2.1 判断 I/O 挂死

bash 复制代码
ls -l /mnt/j
# 若出现:
# ls: cannot access '/mnt/j': Input/output error

sudo 命令也报 I/O error,说明 drvfs 层可能失效。

2.2 安全步骤

  1. 停止对卡死挂载进行任何读写操作(继续读写可能加重损坏)。
  2. 在 Windows 侧确认 J: 盘是否存在并能打开。
  3. 尝试重新插拔移动硬盘(拔出→等 5 秒→插回),等 Windows 完全识别后再操作。
  4. 重启 WSL(常用且快捷)------在 Windows PowerShell 执行:
powershell 复制代码
# 在 PowerShell 中(可不需要管理员权限)
wsl --shutdown
# 然后重新打开 WSL 终端,测试
wsl
ls /mnt/j

若仍异常,重启 Windows 或在 Windows 事件查看器 / 磁盘工具(chkdsk)检查磁盘健康。

2.3 恢复后读写验证

恢复后在 WSL 中运行:

bash 复制代码
ls /mnt/j
touch /mnt/j/testfile
echo "ok" > /mnt/j/testfile
cat /mnt/j/testfile
rm /mnt/j/testfile

若这些命令均可成功,盘已恢复为可读写状态。

2.4 建议

  • 复制期间不要拔盘或让移动硬盘进入睡眠。
  • 对大文件使用 rsync -P--partial --progress,以减轻中断后的损失。
  • 若频繁断开,建议禁用 Windows 的磁盘节能、或使用带独立供电的 USB 集线器。

3. 路径判断

理解"我现在在哪里 → 我要去哪 → 我要输入什么路径"是关键。

四种路径写法

  1. 绝对路径 (以 / 开头)------不受当前目录影响,永远正确。
    例:/root/pathology/rawdata/mnt/j/rawdata/home/ubuntu/test.txt
    建议:复制到移动硬盘时尽量使用绝对路径。
  2. 相对路径(基于当前工作目录 pwd
    • file:相对路径,等价于 ./file,依赖于 pwd 当前所在目录。
    • ./file:当前目录下的 file;常用于执行脚本:./run.sh
    • ../file:上一级目录下的 file
    • ~/file:当前用户 HOME;~ 对 root 是 /root,对 ubuntu 用户是 /home/ubuntu

常见目录与含义

目录 含义
/ 根目录
/root root 的 home
/home/用户名 普通用户 home
/mnt/ WSL 挂载 Windows 盘(例:/mnt/c /mnt/j
/etc 配置文件
/usr/bin 可执行程序
/tmp 临时文件

4. rsync vs cp:为什么推荐 rsync(remote sync)

cp 是简单拷贝,rsync 更智能(增量、断点续传、进度、校验、排除)。

4.1 对比要点

  • 增量复制cp 无;rsync 能只传变化部分。
  • 断点续传cp 无;rsync 支持(--partial/--append/-P)。
  • 进度显示cp 无;rsync--progress
  • 权限与时间cp 要额外参数保时间/权限;rsync -a 自动保留。
  • 网络/远程拷贝rsync 可通过 ssh 等协议直接同步到远程服务器,cp 命令本身不具备此功能。
  • 同步(包括删除目标多余文件)rsync --deletecp 做不到自动同步。

4.2 建议

  • 大数据量、多文件可能断电/拔盘 :用 rsync
  • 单个小文件或临时拷贝cp 足够,但无断点/校验。

5. rsync 详解(常用参数 + 实用示例)

下面把常用参数与典型场景命令给成清单,便于复制粘贴到终端。

5.1 常用参数(实用注释)

参数 含义
-a archive 模式(等同 -rlptgoD:递归、保权限、时间、符号链接等)------最常用
-v verbose,显示详细信息
-h 人类可读(human-readable)
-n dry-run(模拟,不做任何修改)
--progress 显示实时进度
--partial 保存部分文件以便断点续传
-P 等于 --partial --progress,常用快捷
--delete 删除目标中多余的文件(用于镜像同步,慎用)
--exclude='PATTERN' 排除匹配的文件或目录
--include='PATTERN' 包含特定模式(一般配合 --exclude='*' 使用)
--checksum 使用 checksum 校验文件差异(慢但严格)
-e ssh 通过 ssh 传输(用于远程同步)

5.2 常用实例

5.2.1 基础复制(本地)

bash 复制代码
rsync -avh --progress /root/pathology/rawdata/ /mnt/j/rawdata/

注意源路径末尾 / 的差别:/src/ 会将 src 的内容复制到目标目录下;不带末尾 / 则复制整个 src 目录。


5.2.2 检查源文件和目标文件夹下内容差异

bash 复制代码
rsync -avhn /root/pathology/rawdata/ /mnt/j/backup/

5.2.3 中断后续传(显式)

bash 复制代码
rsync -avh --partial --progress /src/ /dst/
# 或
rsync -avh -P /src/ /dst/

5.2.4 排除某些文件(如日志、tmp)

bash 复制代码
rsync -avh --exclude='*.log' --exclude='tmp/' /src/ /dst/

5.2.5 镜像同步(目标变成源的完整镜像)

bash 复制代码
rsync -avh --delete --progress /src/ /dst/

5.2.6 远程(通过 SSH)

bash 复制代码
rsync -avh -e ssh /local/path user@server:/remote/path
# 或从远程拉取
rsync -avh -e ssh user@server:/remote/path /local/path

5.3 复制到 Windows 移动硬盘(我们的模拟场景)

bash 复制代码
# 推荐:带进度、可重跑、不重复传输
rsync -avh --progress /root/pathology/rawdata/ /mnt/j/rawdata/

附1:后台运行 rsync 的示例脚本(带日志)

把下面保存为 backup_to_j.sh

bash 复制代码
#!/bin/bash
SRC="/root/pathology/rawdata/"
DST="/mnt/j/rawdata/"
LOG="/var/log/rsync_rawdata_$(date +%F_%H%M%S).log"

# 1. 干运行,记录到日志
rsync -avhn "$SRC" "$DST" > "${LOG}.dryrun" 2>&1
echo "干运行完成。请仔细检查 ${LOG}.dryrun 文件,确认即将同步的文件列表。"
echo "如需启用删除模式(让目标与源完全一致),请手动在以下命令中添加 --delete 参数。"

# 2. 让用户确认是否继续
read -p "是否继续执行同步?(y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    echo "操作已取消。"
    exit 1
fi

# 3. 执行同步(这里故意去掉了 --delete,让用户根据情况自己决定)
nohup rsync -avh --partial --progress "$SRC" "$DST" >> "$LOG" 2>&1 &
echo "rsync 已启动在后台,日志文件:$LOG"

使用方法:

bash 复制代码
chmod +x backup_to_j.sh
./backup_to_j.sh
# 查看日志
tail -f /var/log/rsync_rawdata_*.log

警告:若在运行过程中拔盘会导致 I/O error;确保移动硬盘不要睡眠或断电。


附2:mount / umount 简要讲解(与 WSL/drvfs 相关)

1. mount 是什么?

所有磁盘(包括 Windows 盘、移动硬盘)要挂载后才可访问。执行:

bash 复制代码
mount

会列出当前挂载点,例如:

复制代码
J: on /mnt/j type drvfs (rw,noatime,uid=1000,gid=1000,metadata)
C: on /mnt/c type drvfs (rw,noatime,...)

解释:J:(Windows 盘)挂载到 /mnt/j,文件系统类型是 drvfs(WSL 专用),rw 表示可读写。

2. mount | grep '/mnt/j' 是什么意思?

这是一种过滤命令输出的写法。

  • mount → 输出所有挂载信息
  • |(管道)→ 把前一条命令的输出"传给"下一条命令
  • grep '/mnt/j' → 在输出中只保留包含 "/mnt/j" 的行

所以:

复制代码
mount | grep '/mnt/j'

意思是:
从所有挂载信息里找出 /mnt/j 对应的挂载信息。

3. umount(卸载)

若要重新挂载先卸载:

bash 复制代码
sudo umount /mnt/j

卸载失败常见原因:

  • 该目录被占用(当前 shell 在 /mnt/j 下或有进程打开该目录)。
  • I/O 挂死(此时 umount 可能报错或无响应)。

查看是否被占用:

bash 复制代码
lsof /mnt/j

4. 重新挂载示例

bash 复制代码
sudo mount -t drvfs J: /mnt/j -o metadata,uid=$(id -u),gid=$(id -g)

说明:metadata 让 drvfs 保留 Linux 风格权限,uid/gid 指定文件属主。


常见问题

  • Q:复制过程中拔盘,如何恢复?
    A:先在 Windows 检查磁盘健康并重新插拔;然后 wsl --shutdown 重启 WSL;若仍异常,重启 Windows 并运行 chkdsk。如无备份,谨慎操作避免写入损坏原盘数据。
  • Q:为什么 mv 速度慢且有风险?
    A:跨文件系统的 mv 实际为 copy + unlink。若中途断电或拔盘,可能导致源文件被删除或部分写入,建议先 rsync/cp 再确认删除。
  • Q:如何避免移动硬盘进入睡眠?
    A:在 Windows 电源管理/磁盘策略中禁用硬盘节能或使用带供电的 USB 集线器。
相关推荐
一尘之中1 小时前
Linux命令行查看磁盘大小完全指南
linux·运维·ai写作
马儿能够一直跑2 小时前
同一个环境中安装两个不同版本esp-idf的python冲突解决方案
linux·运维·服务器
小雪_Snow2 小时前
Rocky 操作防火墙
linux
tang_vincent2 小时前
Linux物理内存管理-引导内存分配器
linux
vortex52 小时前
从 Scoop 故障看 Windows 与 Linux 软硬链接与权限机制的底层差异
linux·运维·windows
洒家肉山大魔王2 小时前
Kubernetes中Pod 处于 CrashLoopBackOff 状态(生产环境)
linux·容器·kubernetes·pod·pod循环重启
Unlyrical2 小时前
为什么moduo库要进行线程检查
linux·服务器·开发语言·c++·unix·muduo
小武~2 小时前
Leetcode 每日一题C 语言版 -- 234 basic calculator
linux·c语言·leetcode
橘颂TA3 小时前
【Linux】System V 通信——共享内存
linux·运维·服务器·c++