在意外地重命名了 /etc 后,我该如何将其重新命名回来?

我正在使用Ubuntu 18.04。
我把/etc文件夹改名为apache2。那是我犯的最大错误。
现在我无法将其改回,因为我需要使用sudo,但每次尝试时都会出错。
sudo: unknown uid 1000

我该如何解决这个问题?我没有可启动的实时系统,在恢复模式下,根终端会打开但随后关闭,并显示“无法打开密码数据库”。

17从安装介质启动,选择“试用Ubuntu”,将根文件系统挂载到/mnt上,进行重命名操作,然后重新启动。 - AlexP
如何启动安装介质? - Bipa
@Zanna,切换没有显示任何菜单。也许其他按钮可以打开它? - Bipa
@Zanna,恢复菜单 -> root 打开终端,但显示无法打开密码数据库并关闭。 - Bipa
@Zanna,没有,还没有 :( - Bipa
好的,我已经修复了。现在正在撰写答案... - Zanna
3个回答

一个解决这类问题的简单方法通常是从一个活动系统启动,将根分区挂载到/mnt,并重命名文件。
如果您没有活动系统或制作活动系统的手段,或者您无法物理访问该系统但可以重新启动并进入GRUB菜单,您可以使用GRUB编辑器获取root shell并重命名文件。
重新启动或关机,打开电源,如果您在启动时通常看不到GRUB菜单,请按Shift键或Esc键进入GRUB菜单。
将光标移动到"Advanced Options for Ubuntu"并按Enter键,然后按e键编辑引导选项(仅限一次 - 在此处进行的更改不会永久保存,因此我们不必事后清理)。
您将看到一个类似于以下内容的屏幕1:

screenshot of GRUB menu editor

将光标移动到以linux开头的行,并将光标移动到该行的末尾,或者在内核引导参数中的任何位置。请确保您在正确的行上,并小心输入,因为系统可能无法启动而没有/etc
添加文本init=/bin/bash并按下F10进行启动。
这将使用Bash shell作为init启动系统。您将获得一个root shell,并且文件系统将被挂载为只读。2要使文件系统可写,请输入以下命令。
mount -o remount,rw /

现在你可以重命名/etc(你可能想先执行ls命令)。
mv /apache2 /etc

现在你可以重新启动,或者通过让根shell用正常的init系统替换自己来完成正常引导3
exec systemd 

我在Ubuntu MATE 18.04上测试了这个过程。

1 非常感谢Kulfy在VirtualBox中获得了GRUB编辑器的高质量截图!
2 尽管在这种情况下无法从/etc的配置文件中设置PATH,但Bash会自动设置一个
3 如果exec systemd对您不起作用,exec /sbin/init应该能解决问题。如果不行,readlink -e /sbin/init应该给出应该运行的任何init程序的路径,然后您可以使用其完整路径exec。如果无法按此方式继续,请直接输入reboot


4非常彻底,包括屏幕截图 +1 :) - WinEunuuchs2Unix
3@Kulfy 非常感谢!太棒了 :D 我不能使用VB,因为我没有足够的RAM。你真是太好了,帮助我改进我的答案。 - Zanna
3我觉得我截了一个太大的屏幕截图 :P ;-) 谢谢你给我署名的截图 :) - Kulfy
1@Racoon 非常欢迎,很高兴你解决了问题 :) - Zanna
尝试在Ubuntu 18.04桌面版上测试,但无法正常工作。完全按照指示操作,但仍然无效。按下F10后只显示几行内容,然后停留在空白屏幕上。你有什么建议吗? - Vijay
@Vijay 是空白屏幕还是控制台?Shell 只会显示文本,提示符只会显示 bash 版本。也许从添加 init=/bin/bash 的那一行中移除 quietsplash 参数,至少可以使过程更加信息丰富。你能告诉我更多关于环境的情况吗?你做了什么,如果没有改变任何东西的话?非常感谢你的反馈。 - Zanna
  1. 如果我在“Ubuntu的高级选项”界面上点击“Enter”,选择会变成“Ubuntu,使用Linux 4.15.0-42-generic”,按下e键会出现与您的图片不同的屏幕。
  2. 如果我在“Ubuntu的高级选项”界面上按下e键,会出现与您的图片相似的屏幕。但无论哪种情况,在Linux行的末尾添加init=/bin/bash后,它都停留在空白屏幕上,没有对任何按键的响应。我将删除quietsplash,如果有什么变化,我会发布。
- Vijay
@Vijay 我现在不在,但是我会尽可能地查看那些情况下的编辑器。 - Zanna
移除 quietsplash 没有帮助。 - Vijay
让我们在聊天中继续这个讨论。 - Zanna
修复方法是从该行中移除"$vt_handoff "。重新检查过了。感谢您所付出的一切努力。 - Vijay
非常感谢你进一步调查,@Vijay :) 我会研究并考虑是否应该在我的回答中添加一条注释。 - Zanna

如果您有一个可用的USB启动盘,您应该能够启动并挂载您现有的文件系统,然后从那里重命名您的/etc目录。这里是一个关于如何创建可启动USB的教程,如果您需要的话。
一旦启动到可启动的USB(如果使用的是Ubuntu 18.04驱动器),选择"尝试Ubuntu而不安装",它将为您提供一个完整的Ubuntu安装实例,在关闭后不会保留任何更改。启动后,您有几个选项: 命令行方式 打开终端并运行lsblk。查找对应于原始安装驱动器的分区,并注意其编号(/dev/sd#)。
然后,使用mkdir -p /mnt/directory为驱动器创建一个挂载点,然后使用sudo mount /dev/sd# /mnt/directory挂载驱动器。使用cd /mnt/directory导航到目录,现在您应该位于安装的根目录中,但是现在具有可用的sudo命令。运行sudo mv apache2 etc并重新启动进入您设想中的工作操作系统。 图形界面方式 通过搜索Disks打开磁盘实用程序。选择看起来像您的安装驱动器的卷,并将其挂载。打开文件管理器,选择已挂载的卷,右键单击/apache2文件夹并将其重命名为/etc,然后重新启动。

“图形方式”不起作用,因为右键菜单中没有“重命名”选项。 - Vijay
1@Vijay 这可能是由于文件权限的问题,你需要以root身份打开文件管理器才能以图形方式进行操作。为此,请在终端中运行命令sudo nautilus。(Ubuntu使用"nautilus"作为它的文件管理器,类似于Windows使用"explorer"。) - AJMansfield
2@AJMansfield 当然,在实际运行的系统中这并不重要,但一般情况下我们应该使用sudo -H nautilus来避免root成为$HOME目录下配置文件的所有者,从而可能导致普通用户无法访问它们。你可能已经知道这一点,但我提到这个是为了其他读者。 - Zanna

  1. 按照此处所示的方法制作可启动的USB链接

  2. 按照此处所示的方法通过按键从USB启动链接

  3. 运行gparted命令,找出您的文件系统分区。假设它是sdxy。

  4. 在终端上运行sudo mount /dev/sdxy /mnt命令。

  5. 在终端上运行sudo mv /mnt/apache2 /mnt/etc命令。

  6. 检查/mnt目录中的文件系统是否已更改名称。

  7. 在终端上运行sudo reboot命令。

  8. 当提示时,拔掉USB并按下回车键。


@Kulfy 我试过了,但没有使用sudo是无法运行的。请参见这里 - Vijay
这是因为sda2被sudo挂载,所以只有sudo才能执行操作。但是如果你通过nautilus(没有特殊权限)挂载驱动器,你可以在没有sudo的情况下执行任务。 - Kulfy
检查了一下 ubuntu@ubuntu:~$ mount /dev/sda2 /mnt mount: 只有root用户才能执行该操作 ubuntu@ubuntu:~$ - Vijay
1据我所知,mount程序非常严格,必须始终以root身份运行;唯一的例外是当文件系统在fstab中并且具有user选项时。udisksctl程序允许普通用户挂载设备,例如使用udisksctl mount -b /dev/sda1(它会在/media/$USER/中创建一个合适的挂载点)。我还没有尝试在实时系统中使用udisksctl,但在实时系统中,您始终是一个特权用户,可以无需密码运行sudo,因此不需要像udisksctl这样的实用工具。 - Zanna