如何从 ubuntu wsl2 恢复意外删除的 /etc 文件夹

如何从 ubuntu wsl2 恢复意外删除的 /etc 文件夹

/etc 文件夹在 Ubuntu-20.04 WSL 中被意外删除。我没有备份,但 Windows 中的 LocalState 路径中确实有 ext4.vhdx。是否可以从此 ext4.vhdx 恢复?我需要恢复 /etc 文件夹并让 WSL 再次运行。请帮忙。

答案1

.vhdx 是您的 Ubuntu 虚拟磁盘。它包含文件系统。您已从文件系统中删除 /etc 目录,因此您已将其从虚拟磁盘中删除。

只需咬紧牙关,删除虚拟机并创建一个新的。

实际上,我们都是通过痛苦的经历才认识到备份的重要性。这只是人之常情。

答案2

正如 Peregrino69 提到的,您将无法从中恢复任何内容,ext4.vhdx因为那只是虚拟磁盘中的“实时”文件系统。一旦您删除/etc,它就会立即从中消失ext4.vhdx

虽然我提供了以下说明,但如果你真的想尝试,我的个人建议与 Peregrino69 的类似。我会重新开始。

不过,我至少会先备份tar cvzf home.tgz ~您的安装中的主目录 ()。这样您就可以将其复制回新安装中。

您还可以执行wsl --export Ubuntu backup.tar以获取当前实例的完整快照。

备份后,您可以执行wsl --unregister <distroname>(留下发行版名称以供您确认,因为这是一个破坏性操作)。

这将删除全部的实例和虚拟文件系统中的所有文件。

然后,您只需运行ubuntu.exe(或ubuntu2004.exe,取决于您安装的 Store 版本)即可重新安装。

什么是“可恢复的”(什么不是)

什么 可以恢復嗎?
/etc就像你第一次安装 WSL/Ubuntu 后一样 是的
您在初始 Ubuntu 配置阶段设置的默认用户名/密码 否,但可以通过以下方式轻松重新创建useradd
/etc您手动安装的软件包所添加的任何配置 或许
/etc您手动添加的任何配置或通过手动执行命令添加的任何配置(例如useradd 不,这些文件需要手动重新创建

如果您同意的话...

创建快照/备份

为了“安全”,我建议备份 WSL 实例:

wsl --export <distroName> <filename.tar>

启动 WSL 时无需/etc

好消息是,运行该wsl命令并在没有 still 的情况下启动 Ubuntu/etc至少会导致在降级状态下运行。由于没有/etc/passwd,您将是“UID/GID 0”,甚至不是root。默认情况下,您还将启动到dash。所以让我们至少通过 launched 获得一个更具功能性的 shell 来开始bash

由于你的提示将是这样的:

I have no name!@Host:dir>

您可能希望将其缩短为PS1='$(pwd)> '。当然,这完全是可选的,但我发现它有助于使内容更具可读性。

/etc/从 WSL/Ubuntu rootfs 映像恢复初始版本

我们的第一个目标是恢复/etc到您首次安装后的状态。为此,我们将使用您从 Microsoft Store 安装的 Ubuntu Appx 包附带的 rootfs 映像。

首先我们需要找到它。首先运行:

package='"*Ubuntu*"'
powershell.exe -c "Get-AppxPackage | Where-Object { \$_.Name -like $package }"

如果只返回一个结果,那就太好了。如果没有,请调整package变量以使其更具体——'"*UbuntuonWindows*"'或者'"*Ubuntu20.04onWindows*"'。一旦您可以运行命令并只获得一个结果...

packageLocation=$(powershell.exe -c "(Get-AppxPackage | Where-Object { \$_.Name -like $package })[0].InstallLocation" | tr -d "\r\n")
packageLocation=$(wslpath "$packageLocation")
tar -C / -xvzf "${packageLocation}/install.tar.gz" "etc/" 

这将找到 Store Appx (UWP) 包,查询其在驱动器上的位置,然后将文件etc/install.tar.gz根目录提取回您的/etc.

退出 WSL,执行wsl --shutdown,然后重新启动。

现在您应该root再次处于(而不仅仅是 UID 0)状态,并且处于您的默认(大概是bash)shell 中。

重新创建您的默认用户

useradd --user-group --groups  adm,dialout,cdrom,floppy,sudo,audio,dip,video,plugdev,netdev --shell /usr/bin/bash --password $(read -sp Password: pw ; echo $pw | openssl passwd -1 -stdin) <username>

为手动安装的软件包重新创建配置文件

这是一个挑战,也是让我同意其他人的观点的部分,即最好删除该实例并重新开始。

您基本上需要为每个以前安装的包重新运行安装(列表存储在中/var,因此它仍然完好无损)并重新创建任何配置文件/etc以及postinst修改它的任何脚本(例如组或用户添加)。

您可以使用以下命令获取所有手动包安装的列表:

apt-mark showmanual

您可以使用以下命令获取放置文件的软件包列表/etc

dpkg -V

但是重新安装的顺序涉及依赖关系,并且在我看来,让一切重新设置“恰到好处”的变化非常小。

此步骤或下一步失败都将导致您的安装处于不稳定状态,并且仍然需要完全重新安装。

手动配置

此时,如果您记得手动进行过任何会影响的更改/etc,请尝试重新创建这些更改。

相关内容