在使用Windows子系统用于Linux时,我使用Windows程序编辑了Linux文件,现在无法再访问它了。


12

我正在Windows上的Ubuntu上使用BashWindows子系统中的另一个Linux发行版(用于Linux),并且已经lxss使用Windows编辑器在目录中编辑了Linux文件。

现在,每当我或某个程序尝试从Linux访问它时,我都会收到一个错误“输入/输出错误”,或者即使我可以在File Explorer中看到该文件,文件也完全消失了。

cat abc
cat: abc: Input/output error

为什么会这样呢?我该如何解决?将来如何避免呢?

Answers:


13

为什么会这样呢?

由于常规的Unix文件系统与Windows文件系统的工作方式不同,因此WSL 用于表示它们的Windows文件的扩展属性存储了有关Linux特定文件属性的额外信息。普通的Windows程序不知道这些属性,并且在编辑文件时不会保留它们。发生这种情况时,有关文件的重要信息将丢失。

当WSL尝试读取文件,但找不到所需的属性时,则会报告错误,就像本地文件系统损坏时会发生的情况一样。如果从头开始看不到文件的属性,则该文件将被视为不存在,并且不会显示在文件列表中。

WSL官方建议

在任何情况下,请勿使用Windows应用程序,工具,脚本,控制台等创建和/或修改Linux文件。

从Windows创建/更改Linux文件可能会导致数据损坏和/或损坏Linux环境,从而要求您卸载并重新安装发行版!

因此(更大,更红,带有更多下划线)。“ Linux文件”表示lxss目录中的所有内容。您可以通过/mnt/c/...DrvFS文件系统从Linux内部修改常规Windows文件,但不能相反。

然而,1903年的Windows 10版本引入了新的机制,允许文件安全地从Windows中进行编辑,只要你去了解它的正确方法。这无助于解决已经损坏的文件的问题,但将来可以避免。

我该如何解决?

如果您已经编辑过文件,但现在无法访问它,则仍然可以从Windows本身读取内容并以这种方式还原文件。

为此,您需要:

  1. AppData\Local\lxss使用文件资源管理器导航回到文件所在目录内的位置,然后将文件移至驱动器上的其他位置,例如桌面。
  2. 之后,重新启动WSL以清除其内部缓存,只需关闭所有终端并打开一个新终端即可。如果正在运行后台服务器进程,则还需要停止这些进程。
  3. 再次在Linux中,转到损坏文件的原始位置。如果您已成功将文件移开,它现在根本不会显示。运行ls检查。
  4. 检查您移出的文件:运行

    cat /mnt/c/Users/.../Desktop/abc
    

    查看文件的原始内容。

  5. 如果到目前为止一切正常,您现在可以将该文件复制回您期望的位置:

    cp /mnt/c/Users/.../Desktop/abc ~/alphabet/abc
    

    cp命令将使WSL恢复文件上必要的隐藏属性。

这些说明适用于常规数据文件,但是如果它是重要的操作系统文件,则可能需要完全重新安装。对于许多非关键程序,从Windows删除损坏的文件并使用程序包管理器重新安装该程序就足够了。一旦文件损坏,您将无法从Linux内部删除该文件。

将来如何避免这种情况?

切勿lxss从Windows 操作目录中的任何文件。代替:

  • 如果您有要从Windows和Linux都访问的文件,请将其存储在目录之外lxssWindows系统上的任何其他位置。您可以使用自动DrvFS互操作性从Linux打开Windows文件:该/mnt/c目录包含C:驱动器中的所有文件,并且可以从Linux读取和写入它们。

  • 从1903 Windows版本(2019年3月)开始,WSL 包括一个特殊的文件服务器,使您的文件可用于所有Windows应用程序。如果你跑

    explorer.exe .
    

    然后“文件资源管理器”将打开并显示当前Linux目录-您可以在该窗口内外复制文件,也可以使用任何应用程序对其进行编辑。目录路径将类似于\\wsl$\Ubuntu\var\www:该\\wsl$\部分通过替代的安全路径发送文件访问权限。

    如果可以的话,这将是前进的最佳途径(有时是上面的要点)。对于旧版本,请继续阅读。

  • 如果需要将文件放在特定位置(例如配置文件),并且要在Windows中进行编辑,则可以从Linux内部建立到该文件或目录的实际位置的符号链接:

    ln -s /mnt/c/.../abc ~/.config/xyz/abc
    

    只要文件在Linux中不需要具有任何特定的权限或属性(如可执行文件或SSH密钥),该文件便会起作用。

  • 或者,也许更好,使用终端内的Linux编辑器编辑Linux文件。nano,,vimemacs,尽管它们都有自己的怪癖,但它们在WSL下都可以随时使用并且运行良好。

  • 如果必须使用Windows程序编辑文件,则没有足够新的Windows版本,也不能使其成为符号链接,请在其他位置进行复制以进行编辑,然后再将其复制回来/mnt/c,就像请修复以上问题,或使用版本控制在多个位置同步您的编辑。

通过一些试验,普通的记事本似乎确实保留了必要的属性,但是它不理解Unix行尾,因此您很可能自己破坏内容,并且在任何情况下我都不会依赖该行为。由于这是一个明显不受支持且未记录的操作,因此任何基于Windows的编辑器都不太可能可靠。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.