Mic*_*mer 12 windows-subsystem-for-linux
我在 Windows 上的 Ubuntu或适用于 Linux 的Windows 子系统中的另一个 Linux 发行版上使用Bash,并且我已经lxss
使用 Windows 编辑器在目录中编辑了一个 Linux 文件。
现在,每当我或程序尝试从 Linux 访问它时,我都会收到错误“输入/输出错误”,或者即使我可以在文件资源管理器中看到它确实存在,该文件也会完全消失。
cat abc
cat: abc: Input/output error
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况?我能做些什么来修复它?我将来如何避免它?
Mic*_*mer 13
由于传统 Unix 文件系统的工作方式与 Windows 文件系统不同,WSL将有关文件的 Linux 特定属性的额外信息存储在用于表示它们的 Windows 文件的扩展属性中。普通的 Windows 程序不知道这些属性,并且在您编辑文件时不会保留它们。发生这种情况时,有关文件的重要信息将丢失。
当 WSL 尝试读取文件时,它找不到预期的属性时,会报告错误,就像本机文件系统损坏时会发生的情况一样。如果它从一开始就没有看到文件的属性,则该文件将被视为不存在,不会出现在文件列表中。
在任何情况下,请勿使用 Windows 应用程序、工具、脚本、控制台等创建和/或修改 Linux 文件。
从 Windows 创建/更改 Linux 文件可能会导致数据损坏和/或损坏您的 Linux 环境,需要您卸载并重新安装发行版!
出于这个原因(但更大,更红,下划线更多)。“Linux 文件”是指lxss
目录中的任何内容。您可以通过/mnt/c/...
DrvFS 文件系统从 Linux 内部修改常规 Windows 文件,但反过来不行。
然而,1903年的Windows 10版本引入了新的机制,并允许文件安全地从Windows中进行编辑,只要你去了解它的正确方法。这无助于解决已经损坏的文件的问题,但可以在将来避免它。
如果您已经编辑了一个文件但现在无法访问它,仍然可以从 Windows 本身读取内容并以这种方式恢复文件。
为此,您需要:
AppData\Local\lxss
使用文件资源管理器导航回文件所在目录中的位置,并将文件移出驱动器上的其他位置,例如桌面。ls
检查。检查您移出的文件:运行
cat /mnt/c/Users/.../Desktop/abc
Run Code Online (Sandbox Code Playgroud)
查看文件的原始内容。
如果到目前为止一切正常,您现在可以将该文件复制回您期望的位置:
cp /mnt/c/Users/.../Desktop/abc ~/alphabet/abc
Run Code Online (Sandbox Code Playgroud)
该cp
命令将导致 WSL 恢复文件上必要的隐藏属性。
这些说明适用于常规数据文件,但如果它是重要的操作系统文件,您可能需要完全重新安装. 对于许多非关键程序,从 Windows 中删除损坏的文件并使用包管理器重新安装程序就足够了。一旦文件损坏,您将无法从 Linux 内部删除该文件。
切勿lxss
从 Windows操作目录中的任何文件。反而:
如果您有一个文件要从 Windows 和 Linux 访问,请将其存储在目录之外,即lxss
Windows 系统上的任何其他位置。您可以使用自动 DrvFS 互操作性从 Linux 打开 Windows 文件:该/mnt/c
目录包含来自 C: 驱动器的所有文件,并且可以从 Linux 读取和写入它们。
从 1903 Windows 版本(2019 年 3 月)开始,WSL包括一个特殊的文件服务器,使您的文件可用于所有 Windows 应用程序。如果你跑
explorer.exe .
Run Code Online (Sandbox Code Playgroud)
然后文件资源管理器将打开,显示当前的 Linux 目录 - 您可以将文件复制进或复制出该窗口,或使用任何应用程序编辑它们。目录路径将类似于\\wsl$\Ubuntu\var\www
:该\\wsl$\
部分通过替代的、安全的路径发送文件访问。
如果可以,这将是最好的前进道路(或者有时是上面的一点)。对于旧版本,请继续阅读。
如果有一个文件需要放在特定位置,例如配置文件,并且您想从 Windows 编辑它,则可以从 Linux 内部创建一个符号链接到该文件或目录的实际位置:
ln -s /mnt/c/.../abc ~/.config/xyz/abc
Run Code Online (Sandbox Code Playgroud)
只要文件不需要在 Linux 中具有任何特定权限或属性(就像可执行文件或 SSH 密钥那样),这就会起作用。
或者,也许更好,在终端中使用 Linux 编辑器编辑 Linux 文件。nano
, vim
, 和emacs
都是现成的,并且在 WSL 下运行良好,尽管它们都有自己的怪癖。
如果您必须使用 Windows 程序编辑文件,则您没有足够新的 Windows 版本,并且您无法将其设为符号链接,请在其他地方复制以进行编辑,然后再将其复制回/mnt/c
,就像修复上述问题,或使用版本控制在多个位置同步您的编辑。
从一些实验来看,普通记事本似乎确实保留了必要的属性,但它不理解 Unix 行尾,因此您可能会自己破坏内容,无论如何我都不会依赖这种行为。因为这是一个明确不受支持和未记录的操作,所以任何基于 Windows 的编辑器都不可能可靠。
归档时间: |
|
查看次数: |
5126 次 |
最近记录: |