Ubuntu 由于/etc/passwd被修改导致无法正常启动问题
不小心在宿主机的终端执行了: echo "root::0:0:root:/root:/bin/sh" > /etc/passwd
执行该命令后,你宿主机的 /etc/passwd 文件被覆盖,导致系统丢失了所有的用户信息(包括 UID 与用户名的映射、家目录定义和 Shell 路径),这会导致 sudo 失效、服务无法启动,以及下次重启后无法登录。
因为系统启动时找不到 root 用户信息,导致系统核心服务(如 D-Bus、磁盘挂载或图形界面)无法初始化。
请根据你目前的情况按顺序尝试以下修复方案:
方案一:利用备份文件恢复(最快)
Linux 系统通常会自动备份上一次正确的用户信息。
如果你现在还有一个 root 权限的终端: 直接运行以下命令:
cp /etc/passwd- /etc/passwd
cp /etc/group- /etc/group
方案二:如果备份文件失效,手动重建基础 root 记录
如果你还能在终端输入命令(且是 root): 执行以下命令恢复最基础的 root 条目,至少保证系统能启动并让你登录:
cat << 'EOF' > /etc/passwd
root❌0:0:root:/root:/bin/bash
daemon❌1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin❌2:2:bin:/bin:/usr/sbin/nologin
sys❌3:3:sys:/dev:/usr/sbin/nologin
sync❌4:65534:sync:/bin:/bin/sync
EOF
注:恢复后请立即运行 apt install --reinstall passwd 或手动找回其他用户。
方案三:如果已经无法执行 root 命令(sudo 报错)
如果你已经失去了 root 权限,但系统还没关机,可以尝试:
利用 pkexec:
pkexec cp /etc/passwd- /etc/passwd
利用已打开的其他服务:如果你有打开的编辑器(如 vim)且是以 root 运行的,直接在编辑器里打开 /etc/passwd 并从 /etc/passwd- 粘贴内容。
方案四:如果宿主机已经重启且无法进入系统(终极修复)
如果系统已经起不来了,你需要进入 单用户模式(Single User Mode) 或使用 LiveCD。
进入 Grub 菜单:启动时长按 Shift。
编辑启动项:选中 Ubuntu,按 e。
修改内核参数:找到以 linux 开头的那一行,在末尾删掉 ro 或 quiet splash,添加: rw init=/bin/bash
启动:按 Ctrl+X。
进入临时 Shell 后: 此时你拥有 root 权限且磁盘是可写的。
恢复备份
cp /etc/passwd- /etc/passwd
如果没备份,就用方案二的 cat 命令手工写一行 root
重启
exec /sbin/init
💡 深度教训与总结
在做虚拟化实验时,强烈建议在宿主机的提示符前加上明显的标识,或者在不同的终端窗口使用不同的颜色。刚才那个 echo 命令原本是发给虚拟机的,但因为在宿主机窗口执行,直接瘫痪了宿主机的账号系统。
请按照以下详细步骤一步步操作:
步骤 1:进入 Grub 菜单
按下宿主机的电源键开机。
立即开始反复点击键盘上的 Esc 键(如果没反应,下次尝试长按 Shift)。
当你看到一个带有 Ubuntu、Advanced options for Ubuntu 字样的蓝色或黑色列表界面时,停止点击。这就是 Grub 菜单。
步骤 2:进入编辑模式
使用键盘上的方向键,确保光标停在第一项 Ubuntu 上。
按下键盘上的 e 键(代表 Edit)。
步骤 3:修改内核启动指令
此时你会看到一段代码。
使用方向键向下移动,找到以 linux 开头的那一行(通常在倒数第三、四行)。
那一行看起来像这样:linux /boot/vmlinuz-xxx root=UUID=xxx ro quiet splash $vt_handoff
移动光标到该行的末尾。
删掉 ro 以及后面的 quiet 和 splash。
在原本 ro 的位置,输入: rw init=/bin/bash
注意:确保 rw 之前有一个空格。
修改后的行看起来应该像:linux /boot/vmlinuz-xxx root=UUID=xxx rw init=/bin/bash
步骤 4:启动到临时 Shell
按下 Ctrl + X 或者 F10。
系统会跳过正常的启动流程,直接给你一个命令提示符(通常是一个 号)。
步骤 5:修复 /etc/passwd(核心操作)
现在你处于 root 权限且磁盘可写状态。请依次执行以下命令:
尝试从备份恢复(最稳妥):
cp /etc/passwd- /etc/passwd
如果备份不存在(提示 No such file),手动重建 root 条目:
echo "root❌0:0:root:/root:/bin/bash" > /etc/passwd
恢复基础组信息:
echo "root❌0:" > /etc/group
步骤 6:重启系统
在提示符下输入:
exec /sbin/init
或者直接按下物理机上的重启键/拔插电源。
但是不知道root密码,所以步骤5后要修改root密码
再次确保备份文件已覆盖回原位(这能找回所有丢失的用户)
sudo cp /etc/passwd- /etc/passwd
sudo cp /etc/group- /etc/group
sudo cp /etc/shadow- /etc/shadow
(关键步骤)重置 root 密码: 虽然恢复了备份,但为了稳妥起见,建议紧接着执行 passwd root,以确保认证系统重新同步
passwd root
修正权限(如果权限不对,重启依然会黑屏)
sudo chmod 644 /etc/passwd /etc/group
sudo chmod 600 /etc/shadow
同步并重启:
sync
exec /sbin/init
既然你现在已经以 root 身份登录进去了,请按照以下步骤操作,确保你的系统完全恢复正常:
-
确认你真正的用户名
如果你不记得准确的用户名了,可以通过查看 /home 目录来确认:
bash
ls /home
这里显示的文件夹名称,就是你平时登录系统用的真正用户名。 -
检查该用户是否已经在 /etc/passwd 中
执行以下命令(将 你的用户名 替换为上面看到的名称):
bash
grep "你的用户名" /etc/passwd
如果能看到结果:说明该用户已经找回来了,下次重启可以正常登录。
如果看不到结果:说明你之前的 cp /etc/passwd- /etc/passwd 并没有找回你的账号。 -
如果账号没找回来,如何手动添加?
如果你在 /etc/passwd 里找不到你的用户名,但 /home/ 下有你的文件,请执行:
bash
从备份文件里搜索你的用户行并追加回去
grep "你的用户名" /etc/passwd- >> /etc/passwd
grep "你的用户名" /etc/group- >> /etc/group
grep "你的用户名" /etc/shadow- >> /etc/shadow -
终极检查:确保系统账号完整
系统卡在 D-Bus 或登录界面的主因是缺少“系统账号”。请执行以下命令检查:
bash
wc -l /etc/passwd
正常结果:行数应该在 30 - 50 行之间。
异常结果:如果只有 1 行(只有 root),千万不要重启,必须执行 cp /etc/passwd- /etc/passwd。 -
确保下次启动成功的最后一步
执行一次权限锁定:
bash
chown root:root /etc/passwd /etc/group /etc/shadow
chmod 644 /etc/passwd /etc/group
chmod 600 /etc/shadow
总结: 只要 /etc/passwd 里的行数恢复到 30 行以上,且包含你平时用的那个用户名,你重启后就能看到熟悉的登录界面并正常使用了。
关闭图形界面,可以使用以下几种方法。
方法 1:临时关闭(本次启动有效)
这会立即停止图形界面服务,回到纯文本控制台。
bash
对于 Ubuntu (使用 GDM)
sudo systemctl stop gdm3
或者通用的命令
sudo systemctl isolate multi-user.target
注:执行后你的显示器可能会闪烁一下,然后进入黑屏命令行。
方法 2:永久关闭(重启后依然是命令行)
这是最推荐的做法,让系统默认启动到命令行模式。
bash
设置默认启动级别为多用户文本模式
sudo systemctl set-default multi-user.target
以后如果想改回图形界面: sudo systemctl set-default graphical.target
以后想临时启动图形界面: sudo systemctl start gdm3
方法 3:通过 Grub 参数关闭(内核级禁用)
在启动时就告诉内核不要加载图形驱动相关的部分。
编辑 Grub 文件:sudo vi /etc/default/grub
找到 GRUB_CMDLINE_LINUX_DEFAULT 行。
将 quiet splash 改为 text。
更新配置:sudo update-grub

浙公网安备 33010602011771号