快速使用可以直接看 Chapter 1(移动文件);
和我一样的新手建议按顺序阅读:3(路径教学)→ 4(rsync vs cp)→ 5(rsync 详解)→ 1(移动文件) ,遇到I/O error看 2(I/O error 解决)。
目录
- WSL2 → Windows 外接移动硬盘(J:)移动文件:步骤与命令 【本文以移动硬盘
(J:)为例】 - I/O error(
Input/output error)的判断与解决步骤 - 路径教学(什么时候用绝对 / 相对 /
~/.//../) rsync与cp的区别(面向大文件 / 跨系统场景)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 实际是复制 + 删除,风险更高):
bashmv /root/pathology/rawdata /mnt/j/ # 可以,但风险:操作中断可能导致数据丢失 # 更稳妥的做法 cp -r /root/pathology/rawdata /mnt/j/ -
检查内容是否复制完整
bash# 快速检查差异(基于文件大小) rsync -rvn --size-only /root/pathology/rawdata/ /mnt/j/rawdata/ # 没有输出任何文件名即提示内容大小一致 -
如果发现不一致,重新运行 ;也可跳过前述检查步骤直接运行(会自动检测)
bashrsync -avh --progress /root/pathology/rawdata/ /mnt/j/rawdata/ -
确认后删除源
bashrm -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 节说明的恢复步骤。
mount和umount简介见 附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 安全步骤
- 停止对卡死挂载进行任何读写操作(继续读写可能加重损坏)。
- 在 Windows 侧确认 J: 盘是否存在并能打开。
- 尝试重新插拔移动硬盘(拔出→等 5 秒→插回),等 Windows 完全识别后再操作。
- 重启 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. 路径判断
理解"我现在在哪里 → 我要去哪 → 我要输入什么路径"是关键。
四种路径写法
- 绝对路径 (以
/开头)------不受当前目录影响,永远正确。
例:/root/pathology/rawdata、/mnt/j/rawdata、/home/ubuntu/test.txt。
建议:复制到移动硬盘时尽量使用绝对路径。 - 相对路径(基于当前工作目录
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 --delete,cp做不到自动同步。
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 集线器。