第一次接触Ubuntu的时候,我其实挺不习惯的。以前在CentOS和Debian系服务器上折腾惯了,装完系统第一件事就是“sudo passwd root”给root设个密码,甚至习惯直接root登录干活。结果装完Ubuntu 22.04发现自己居然连root密码都没设置过,安装过程中压根没有让你设置root密码的步骤,登录界面能看到的只有装系统时创建的那个普通用户。当时我第一反应是“这不是残废系统吗”,后来才意识到,Ubuntu这套默认无root密码的设计不是疏忽,是故意的。
如果你也有类似的疑问,或者你正在被“忘记root密码”“修改root密码”“root密码到底怎么设置”这类问题卡住,这篇文章基本能把场景聊透。不论你是物理机、虚拟机、云服务器还是WSL环境,底下这些方法都能用得上。我会从机制讲起,再逐步覆盖正常设置、忘记密码后的恢复流程,以及一些不常用但关键时刻能救命的兜底操作。
1. 为什么Ubuntu默认没有root密码:先搞清楚机制再动手
很多新手踩坑,踩的不是操作本身,而是压根没理解Ubuntu的用户权限模型。CentOS、RHEL这类发行版在安装时会强制你设置root密码,全程用root管理。Ubuntu从桌面版到服务器版则完全是另一套逻辑:默认不启用root账号,也不设置root密码,管理操作全部通过一个拥有sudo权限的普通用户完成。
这套机制的核心是sudo工具。安装Ubuntu时你创建的第一个用户会被自动加入sudo组,相当于拿到了“管理员授权”。执行管理命令时不用切到root,而是通过sudo command临时提权。系统会要求输入当前普通用户的密码来确认身份。注意,这里验证的是你自己账号的密码,不是root的。
为什么Ubuntu要这么设计?主要是安全和审计两个原因。安全方面,root账号是攻击者的首要目标,默认禁用等于直接踢掉了一个暴力破解入口。审计方面,每次sudo操作都会在/var/log/auth.log里留下记录,出了事可以追溯到底是谁、在什么时间执行了什么命令。而直接root登录,所有操作都混杂在同一个身份下,排障和追责都会麻烦很多。
想验证这套机制,可以直接看/etc/shadow文件里的root记录。在终端输入:
sudo grep '^root:' /etc/shadow正常安装完的Ubuntu,这行一般是root:*:19000:0:99999:7:::或者root:!:...的形式。密码字段里的星号和感叹号都表示“锁定状态”,也就是说root账号没有可用密码,物理登录和远程登录都进不去,只能以普通用户身份通过sudo提权。
理解了这个前提,你就会明白:“给root设置密码”和“修改root密码”不是一回事,前者是从锁定状态激活root账号,后者是换个新密码。底下的操作虽然都是passwd root,但适用场景和前置条件完全不同。
2. 给root设置或修改密码:最简单也最容易被忽视细节的操作
2.1 sudo passwd root 完整流程
给root设置初始密码的操作很简单,一句话总结就是:
sudo passwd root执行后会依次提示你输入两次新密码。这里有个容易让人懵的点:终端里输密码时屏幕上什么都不显示,连星号都没有。很多人以为键盘坏了或者系统卡住,其实是正常的,输完回车就好。
整个交互过程大概是这样:
[sudo] password for yourname: New password: Retype new password: passwd: password updated successfully看到“password updated successfully”就是成功了。这个命令的本质是:通过sudo获得临时的root权限,然后调用passwd命令修改root账号的密码字段。
如果你的Ubuntu当前已经处于root身份(比如刚执行过sudo -i),那直接运行:
passwd root效果相同,但特意跑到root身份下去改root密码其实没必要,sudo passwd root一步就够了。
2.2 修改root密码的两种情况
已经设置过root密码、现在想换一个,分两种情况:
第一种是你还记得当前root密码。直接登录root或者通过su -切到root,然后运行passwd root,输入当前密码验证后设置新密码。
第二种是你已经不记得当前root密码了,或者觉得输密码太麻烦。比如你有sudo权限的普通用户还能登录,那直接sudo passwd root就能重置——这个命令并不会验证旧的root密码,因为sudo本身已经完成了身份授权。很多教程只说了“修改root密码”却没强调这一点,导致一部分人以为必须先知道旧密码才能改,冤枉路走了一大截。
2.3 验证密码是否真的设置成功
密码设置完,很多人心里不踏实,怕没生效。我习惯用两步验证:
先看shadow文件是否更新:
sudo grep '^root:' /etc/shadow正常设置成功后,root行会从root:*或root:!变成类似:
root:$6$abcdefgh$...长篇哈希字符串...:19000:0:99999:7:::$6$表示使用SHA-512加密,$y$是更新的yescrypt加密方式,看到这种格式就对了。
再测试能否用root登录:
su -输入刚设置的root密码,能正常进入root shell说明没问题。su -和sudo -i的区别在于,前者用的是root自己的密码,后者用的是当前用户的sudo权限,两者在最终效果上都是切到root shell,但验证途径完全不同。
2.4 密码强度与生成建议
给root设置密码时,我的建议是至少16位,尽量用混合大小写字母、数字和符号的组合。如果你想省脑子,可以用系统自带的密码生成工具:
openssl rand -base64 24输出一串比如v6xL9tJz2mWpQ8kR3uBfN4cY这样的随机字符,复制到密码设置里就行。当然,生成的密码要记在密码管理器里,别只存脑子里,早晚会忘。
3. 忘记root密码时:从恢复模式重置的完整链路
3.1 什么时候会用到恢复模式
很多人平时根本不用root账号,密码设完就忘了。直到某天需要执行某些必须root的操作、或者sudo身份本身也失效时,才想起密码早被抛到脑后了。还有一种更常见的场景:你是接管别人的服务器或者二手虚拟机,前任管理员设置的root密码根本没移交给你。
这时候就需要绕过登录验证,从系统层面重置密码。Ubuntu自带的恢复模式(Recovery Mode)是首选项,整个流程不需要额外介质,只用本机就能完成。
3.2 进入恢复模式的具体操作
搞清楚步骤再动手:
- 重启电脑,在BIOS/UEFI自检过后、GRUB引导菜单出现时,按住
Shift键(部分新版本按Esc)进入GRUB菜单。 - 选择“Advanced options for Ubuntu”,回车进入。
- 在内核列表里找到带“(recovery mode)”字样的选项,按回车启动。
- 系统加载完会进入一个恢复菜单(Recovery Menu),里面有几个选项,选择“root – Drop to root shell prompt”。
3.3 到这一步很多人的文件系统是只读的
进入root shell后,一个关键问题马上会出现:此时根文件系统是只读挂载的。这是恢复模式的默认行为,目的是防止故障状态下文件系统被二次破坏。如果你不做任何处理直接运行passwd root,大概率会看到Authentication token manipulation error这样的报错,密码改不成功。
解决方式很固定,先重新挂载根文件系统为可读写:
mount -o rw,remount /执行完可以顺手确认一下:
df -h / | tail -1如果显示的挂载参数里有rw字样,说明已经是读写状态了。然后正常修改密码:
passwd root连续输入两次新密码,看到更新成功的提示,输入exit退出root shell,回到恢复菜单选择“Resume normal boot”继续正常启动。
3.4 云服务器和物理机的差异
以上流程对物理机、本地虚拟机完全适用。但云服务器要另说——云平台上通常没法进入GRUB菜单,因为控制台界面比较有限,很多云厂商的VNC体验也只能呈现BIOS阶段,Shift键敲烂了也进不了GRUB。这种情况下,更实际的做法是直接通过云厂商提供的方式挂载系统盘去重置密码。
比如很多云平台支持“重置实例密码”功能,或者在救援模式下挂载数据盘后通过chroot修改密码。这些平台差异比较大,就不在这里展开了,总之记住一点:碰到云服务器,优先看厂商控制台有没有密码重置入口,别死磕本地恢复模式。
4. 单用户模式与chroot兜底:当恢复菜单也不灵的时候
4.1 给GRUB加参数,直接进root shell
恢复模式菜单偶尔也会抽风,比如系统文件损坏、引导异常导致菜单选项报错。另一种思路是直接在GRUB层面做手脚,跳过系统菜单,启动后直接进root shell。
步骤如下:
- 重启进入GRUB菜单。
- 选中默认的Ubuntu内核启动项,按
e键进入编辑模式。 - 找到以
linux开头的一行(通常是第二行或第三行),在行尾添加参数:
rw init=/bin/bash注意这里的rw很关键,它会让内核挂载根文件系统时直接以读写模式挂载,省去了恢复模式里再mount -o rw,remount /的步骤。init=/bin/bash的意思是让系统跳过正常的init进程(systemd),直接启动一个bash作为初始进程,跳到root shell。
- 按
Ctrl+X或F10启动。
启动完成后你会直接进入root命令行,此时文件系统是读写的,直接:
passwd root改完密码重启即可。
这个方法的限制是如果你用了全盘加密(LUKS),启动过程会要求输入解密密钥,没有密钥的话走不通。另外,因为跳过了systemd,系统服务和网络都不会启动,只适合做密码重置这类基础操作,别指望改完密码顺便在里面装包。
4.2 用安装介质chroot改密码
还有一种兜底方案,适合GRUB都进不去、或者不想动引导配置的情况:拿一个Ubuntu的启动U盘(或者ISO镜像的live环境),启动进入桌面环境,然后通过chroot挂载目标系统修改密码。
启动live环境之后,先确认目标系统的根分区位置:
lsblk -f根据分区大小和文件系统类型判断哪个是自己的系统盘。然后挂载根分区和其他必要目录:
sudo mount /dev/sda2 /mnt sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys接着切进目标系统:
sudo chroot /mnt /bin/bash在chroot环境中执行:
passwd root修改完成后依次退出chroot并卸载分区:
exit sudo umount /mnt/dev sudo umount /mnt/proc sudo umount /mnt/sys sudo umount /mnt然后重启,拔掉启动介质,按正常流程进入系统。
这个方法比GRUB参数法更通用,也能处理更多类型的系统故障,不只是密码重置。比如系统引导坏了、某个服务起不来导致系统循环重启,chroot进去修都是常规操作。它唯一的成本是需要一个可用的Ubuntu启动介质,手边没有的话就得现场做一个。
4.3 如果是普通用户密码忘记而不是root密码忘记
顺带提一嘴,很多人搜索“Ubuntu忘记root密码”时,实际场景其实是忘了登录界面那个普通用户的密码。这种情况下不需要这么复杂,直接在GRUB里用恢复模式,走到root shell后执行:
mount -o rw,remount / passwd 用户名把“用户名”换成你的账号名就行。或者更简单:重启,在登录界面按Ctrl+Alt+F2切换到TTY终端,用root身份登录后强制修改普通用户密码。不过这个前置条件是root密码你得知道,不知道还是走恢复模式方便。
5. root密码设置之后的日常与安全:哪些事别再踩坑
5.1 root密码设完,SSH还是连不上?
这是设置root密码后最高频的困惑:密码明明改成功了,用SSH工具连服务器却提示Permission denied,密码输错可能还会无限重试被拉黑。
原因在于Ubuntu默认的SSH配置里,PermitRootLogin通常是prohibit-password或者直接不允许root密码登录。这是安全加固策略的一部分——root账号密码如果被暴力破解成功,整台服务器就沦陷了,所以默认把root远登录入口关掉。
如果你确实有root远程登录的需求(比如某些自动化工具需要),可以修改SSH配置文件:
sudo nano /etc/ssh/sshd_config找到:
#PermitRootLogin prohibit-password改成:
PermitRootLogin yes然后重启SSH服务:
sudo systemctl restart sshd这里我不建议在公网服务器上开启root密码登录,被爆破的体验极其酸爽。如果你需要在服务器上做管理操作,老老实实用普通用户的sudo权限就够了。跑在内网、且对安全性有能力兜底的话,可以自行权衡。
如果你只想临时用一下,还有一种折中做法——设好root密码后在本地用su -切到root执行操作,SSH入口继续保持关闭状态。
5.2 设root密码前先想清楚:你真的需要吗
很多教程喜欢说“Ubuntu要设置root密码才能管理”,这是典型的误导。Ubuntu的机制设计初衷就是让你不要依赖root账号,日常管理走sudo完全够用。设置root密码意味着开放了一个额外的入口,多一份需要保护的东西。
如果你设root密码只是为了偶尔切到root执行几条命令,我更推荐保持root密码为锁定状态,直接sudo -i临时获得root shell。这个命令在终端里输入后,验证的是当前用户的密码,不会动root的密码状态,用完exit退出就行。
5.3 密码设完就忘的老毛病,怎么治
root密码不像普通用户密码,它平时基本用不到,遗忘概率很高。我的做法是设完就写进密码管理器(或存在一个加密笔记里),同时用系统内置的钥匙串或保险库管理工具统一托管。
如果你实在不放心自己记性,还可以在设置密码时顺便生成一个备份密钥文件:
echo 'root密码: 你的密码' | gpg --symmetric --output ~/root-password.gpg用GPG对称加密保存在本地,需要时解密查看。文件本身是加密的,即使被拷贝走没有密码也打不开。这个方法算是个不太常规但很实用的习惯,系统管理员手里同时管着几十台机器时特别有用。
5.4 设置root密码后有时需要注意桌面登录
如果你在Ubuntu桌面版上设置了root密码,注意在登录界面手动输入root用户名时,默认情况GNOME登录界面是看不到root这个账号的(因为Ubuntu默认隐藏UID小于1000的用户)。这也是正常现象,不代表密码设置失败。你可以在登录界面点击“未列出?”然后手动输入root用户名和密码,或者干脆继续用普通用户日常登录,只在需要时通过终端切root。
5.5 一个额外提醒:chroot环境里也要注意文件系统挂载状态
前面提到的恢复模式和chroot操作,都是直接把密码重置指令扔到目标系统的shadow文件里。如果你在操作过程中发现passwd命令报错,比如提示卡在“cannot change mode”或者文件写不进去,九成是文件系统还是只读状态。这时候需要确认挂在目标分区的选项,重跑一遍挂载命令,确保是rw。
顺带说明一个底层逻辑:passwd写入shadow并不是简单覆盖一个密码字符串,它要对密码做哈希计算、加盐、生成新的shadow条目,整个写入过程涉及到文件锁和权限校验。只读文件系统上这些操作都会被拒绝,所以看到报错不要慌,先去查挂载状态。
6. 写在最后的一点体会
我自己的服务器和开发机,大部分情况下都不会主动设置root密码,而是维护一个带sudo权限的管理员账号。真正需要root的空闲操作,用sudo -i就够了。只有在少数场景——比如某些应用强制要求root登录、自动化脚本需要直接执行root命令——才会显式给root设置一个高强度密码,并配合SSH公钥登录一起使用。
设置root密码这事,本身不难,难的是理解自己为什么要这么操作。如果你只是想解决“系统提示需要root权限”,那老老实实用sudo。如果是为了给root账号建立一套可用的登录凭据,那按本文第一种方式操作就行。如果连sodu都失效了,那就走恢复模式或者chroot。
改完密码之后,记得把新密码存进密码管理器,别问我为什么强调这个,我是靠格式化系统解决过自己密码问题的人。