/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
,请尝试重新创建这些更改。