
root 密码这个东西平时不起眼一旦忘了真的能逼得人原地转圈。我见过不少同事服务器跑得好好的业务一点问题没有就是某个早上突然要用 root 登录做配置变更密码怎么都不对——等反应过来已经折腾了两个小时。这篇内容围绕 root 重置密码这件事把我在 Linux 服务器、MySQL/MariaDB 数据库以及几个常见中间件上踩过的坑和亲测有效的步骤全部整理出来。刚接手服务器的运维新人、被临时拉去救火的后端开发或者纯粹想弄明白重置原理的读者都能在这里找到能直接照做的方案。先说明一点本文讨论的是服务器和桌面环境下 root 账户的密码找回重心落在“密码遗忘后的重置”不是 Android 刷机获取 root 权限那种玩法。后者涉及的风险和场景完全不同不在这次的范围里。以下所有操作前提都是你拥有这台机器的物理控制权或系统级访问能力这是运维授信的基本边界也请务必只在你拥有合法管理权的设备上执行。1. 动手之前先搞清楚你要重置的是哪个 root1.1 两种最常见的 root系统账户与数据库账户很多人一听“root 密码忘了”就直接开冲但实际上“root”这个词在不同语境下指的东西完全不同。最常见的两类一类是操作系统的超级管理员账户也就是 Linux 里的root登录进系统后拥有全部权限另一类是数据库软件自带的超级管理员账户比如 MySQL、MariaDB 里的root它只控制数据库实例的访问权限和系统 root 没有直接关系。这两者重置方法差异极大。系统 root 密码忘了通常要借助 GRUB 引导菜单进入救援模式或单用户模式通过修改内核启动参数来绕过密码认证数据库 root 密码忘了则要修改数据库配置文件用skip-grant-tables或初始化脚本的方式跳过权限校验然后重新写回密码哈希。我见过最夸张的一次是把 CentOS 7 的系统 root 密码和 MySQL 的 root 密码同时忘了结果同事只重置了系统的数据库死活连不上一直报 error 1045。实际上那次只需要把 MySQL 的免密配置加上、服务重启一下就好。所以第一步不是急着找教程而是确认“你忘了的是什么密码”。1.2 重置前三件必做的事确认访问权限、搞清楚版本、留好备份确定了目标之后动手前我建议做三件小事这三件事能帮你省下大量返工时间。第一确认你还能用什么方式接触这台机器。如果是本地物理机那 GRUB 菜单和单用户模式是首选如果是云服务器大部分云厂商的控制台都提供 VNC 或救援模式入口可以先通过控制台进入系统再操作如果你有另一个拥有 sudo 权限的普通用户那甚至不用重启机器直接在系统内改密码都行。第二搞清楚操作系统或数据库的具体版本。CentOS 6 和 CentOS 7 的重置方式就不一样GRUB 版本不同进入单用户模式的手法也不同MySQL 5.7 和 MySQL 8.0 在重置密码时的 SQL 语句也有差异MariaDB 10.4 之后默认的认证插件跟以前完全不同。版本没确认清楚照着网上的老教程抄很容易卡住。第三能备份就备份。数据库的 root 密码重置操作之前一定先把数据目录所在磁盘快照或导出备份做一份系统密码重置如果涉及修改 GRUB 配置也可以先把原引导文件复制出来。密码重置本身不会动业务数据但万一你在排查过程中手滑执行了什么没有备份就真的只能哭了。1.3 密码重置的整体思路绕过认证重新写入新哈希所有 root 密码重置方案归根结底都是同一条思路暂时把“身份认证”这道门拆掉进到系统内部用新密码替换掉旧密码的哈希值然后重新把门装上。不管是单用户模式、rd.break、skip-grant-tables还是 Windows 下的 PE 工具本质都是在绕过或暂停认证环节。理解这个思路很重要。因为实际操作中经常会遇到“进了重置环境但改不了”的情况比如系统分区是只读挂载、数据库服务起不来、文件权限不对——这时候只要你想明白“我现在的目标就是修改某个存储密码的文件”排查方向自然就有了。系统密码存储在/etc/shadow数据库密码存储在mysql.user表里Windows 本地账户密码存储在 SAM 注册表文件里。方向对了方法只是细节。2. Linux 系统 root 密码重置从 CentOS 到 Ubuntu 的完整打法2.1 CentOS/RHEL 7 的 rd.break 方法CentOS 7 及之后的 RHEL 系系统推荐用rd.break来重置密码这是我目前用过最稳的方法。它通过破坏系统启动流程让内核在切换根文件系统之前停下来给你一个可以直接修改系统的 shell 环境。具体步骤是这样的。重启服务器在出现 GRUB 菜单时快速按下键盘上的e键进入编辑模式。找到以linux16或linux开头的那一行这一行通常是内核启动参数里面有root/dev/mapper/...和ro这样的内容。把光标移到这一行的末尾空一格输入rd.break然后按Ctrlx启动。系统会进入一个叫做switch_root的紧急环境这时候命令提示符前面会显示类似switch_root:/#的字样。此时根文件系统还挂在/sysroot而且是只读状态。先执行下面这行命令把根目录重新挂载为可写mount -o remount,rw /sysroot然后进入真实的系统根目录chroot /sysroot到这里你已经在原系统的环境里了接下来直接改密码passwd root系统会提示输入两次新密码。密码输入时屏幕不会显示字符这是正常的不要以为是键盘坏了。改完之后如果你启用了 SELinux还需要创建一个标记文件让系统在下次启动时自动修正安全上下文touch /.autorelabel最后依次退出系统会自动重启exit exit这里有个很关键的细节/sysroot的只读挂载是很多新手卡住的第一个环节。如果不先执行mount -o remount,rw /sysroot直接在switch_root环境下执行passwd大概率会报cannot change password之类的错误因为密码文件所在的真实根目录还处于只读状态。另外touch /.autorelabel这步在启用 SELinux 的机器上必须做否则重启后 SELinux 上下文标签不对密码明明改对了也照样登录不了。云服务器上如果通过控制台的 VNC 连接这个操作同样适用只是要注意在 GRUB 菜单出现时及时操作有些云平台的默认 GRUB 等待时间非常短需要提前在系统里把grub2的GRUB_TIMEOUT调大一点我这里建议设置成 5 秒以上等需要时不至于紧张。2.2 老版本 CentOS/RHEL 6 的单用户模式CentOS 6 和更早的 RHEL 6 系统用的是老版 GRUB方法和 7 系有明显区别。重启后在 GRUB 界面按下任意键停在菜单处按e进入编辑模式找到以kernel开头的那一行同样在行尾输入一个single或数字1然后按b启动。系统会直接进入单用户模式也就是维护模式此时 root 不需要密码就能拿到一个 shell。如果是本地终端操作你一般会直接看到#提示符。偶尔在某些配置下需要先按回车才会出现提示符。接着手动把根分区重新挂载为写模式mount -o remount,rw /然后执行passwd root输入两次新密码后重启即可reboot这里要提醒一点老版本的单用户模式在部分系统上可能存在网络服务被拉起的问题虽然对改密码没有影响但从安全角度讲操作完成后立刻重启是最稳妥的。另外 CentOS 6 的 GRUB 按b启动这个细节和 7 系完全不同很多照着 7 系教程操作的人会在这一步卡住因为 7 系用的是Ctrlx。如果你的系统是 RHEL 系新内核版本比如打着“linux 5.5 重置 root 用户”这类口水话的实际场景其实方法跟 rd.break 没什么本质区别还是老一套GRUB 编辑、加启动参数、进 chroot 环境。不必被版本号吓住原理不变。2.3 Ubuntu/Debian 系Recovery 模式与单用户 ShellUbuntu 和 Debian 系的密码重置思路有点像但操作入口不一样。Ubuntu 默认在 GRUB 里带了 recovery mode 选项操作起来比 CentOS 友好一点。重启系统在出现 GRUB 菜单时如果没看到菜单就按住Shift键BIOS 启动或反复按Esc键UEFI 启动。进入菜单后选择Advanced options for Ubuntu然后选择带(recovery mode)后缀的内核项。系统会进入一个 recovery 菜单里面有几个选项比如 resume、clean、dpkg、fsck 等。我们要选的是root - Drop to root shell prompt回车后就能进入 root shell。这个模式下文件系统一般也是只读的先重新挂载mount -o remount,rw /然后直接改密码passwd root改完后执行reboot或者exit返回 recovery 菜单再选 resume 正常启动。Debian 和 Ubuntu 的区别在于Debian 可能没有现成的 recovery mode需要像 CentOS 那样在 GRUB 里手动给内核参数加single。如果 recovery 模式进不去还有一个非常实用的备选方案——用 Ubuntu 安装 U 盘或 Live CD 启动进到试用桌面环境后挂载硬盘根分区再用chroot进入原系统改密码sudo mount /dev/sdaX /mnt sudo chroot /mnt passwd root这个 Live CD 方案的适用范围远超 Ubuntu几乎适用于所有 Linux 发行版。只不过需要你有系统盘或安装镜像在手。我在排查 UOS 这类国产桌面系统的 root 密码时也习惯先用这种方式毕竟各家默认的 recovery 菜单设计不太一样而 Live CD 方案只依赖底层文件系统结构反而稳定。2.4 SELinux 和密码策略带来的两个隐形坑Linux 系统密码重置技术步骤本身不难真正坑人的往往是两个无光的限制条件。第一个是 SELinux。前文提到的touch /.autorelabel就是典型案例。SELinux 开启时每个文件都有安全上下文标签如果你通过重置环境修改了/etc/shadow但该文件的 SELinux 标签没有正确同步重启后系统可能依然拒绝授权。我当时第一次在 CentOS 7 上重置密码后反复确认密码没错却登录不了排查了很久才意识到是 SELinux 的问题。有了那次教训之后凡是改了密码我都不省touch /.autorelabel这一步。第二个是密码策略。越严格的系统越可能启用 PAM 的密码复杂度配置比如pam_pwquality模块要求密码必须多少位、必须含大小写和特殊字符。你在单用户模式下执行passwd时如果设置了过于简单的密码可能会直接收到You must choose a longer password之类的提示。解决方式很简单设置一个符合策略的强密码就好。顺带说一句改完密码后如果你还计划在这个系统上配置自动化任务、备份脚本等记得检查一下这些脚本里是否硬编码了旧密码。这个坑我踩过一次改完 root 密码备份任务全部静默失败排查了两天才发现是脚本里还留着旧凭据。3. MySQL / MariaDB 的 root 密码重置与 access denied 排查3.1 方法一skip-grant-tables 临时免密数据库 root 密码忘记最经典的方法就是skip-grant-tables。作用是让 MySQL/MariaDB 启动时跳过权限表的校验任何人都能免密码连接然后你在里面把密码重新写回去。以 MySQL 为例先停掉数据库服务systemctl stop mysqld然后编辑配置文件MySQL 通常改/etc/my.cnfMariaDB 在 Ubuntu 上通常是/etc/mysql/mariadb.conf.d/50-server.cnf。在[mysqld]段落下面加一行skip-grant-tables保存退出启动服务systemctl start mysqld此时直接连接数据库mysql -uroot不需要密码就能进去。进去之后先刷新权限让修改立即生效然后重新设置密码。MySQL 5.7 及以上版本推荐用ALTER USERFLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY NewStrongPass_2025; FLUSH PRIVILEGES;如果是 MySQL 5.6 或更早的版本可以用UPDATE语句直接改mysql.user表UPDATE mysql.user SET authentication_string PASSWORD(NewStrongPass_2025) WHERE Userroot AND Hostlocalhost; FLUSH PRIVILEGES;操作完毕后一定要记得把配置文件里加的那行skip-grant-tables注释掉或删掉然后重启数据库服务。这一步是整个操作里最容易遗漏的一旦漏了数据库就长期处于裸奔状态任何人都能无密码连接这可是生产环境的大忌。3.2 方法二init-file 初始化脚本如果你不想改主配置文件或者你的数据库启动方式比较特殊比如容器化部署不方便编辑配置文件init-file是一个更轻量的方案。它允许 MySQL 在启动时执行一个包含 SQL 语句的文本文件而这个执行发生在权限系统完全加载之前。先把新密码写进一个临时文件比如/tmp/mysql-init.txtALTER USER rootlocalhost IDENTIFIED BY NewStrongPass_2025;然后用--init-file参数启动 MySQL。在 systemd 环境下可以临时用这个命令直接起一个前台进程注意修改路径mysqld --init-file/tmp/mysql-init.txt MySQL 启动后root 密码已经被改成了文件里指定的值。确认无误后杀掉这个临时进程再用正常方式启动 mysqld。最后把/tmp/mysql-init.txt删掉防止 SQL 文件里残留密码信息被其他人看到。这个方法的好处是不用改动持久化配置适合不想因为一次密码重置就动到主配置文件的场景。但有两点要注意一是 MySQL 服务启动用户必须有权读取这个 init 文件通常 mysqld 是以mysql用户运行的放在/tmp下一般没问题但如果放在 root 的$HOME目录下就可能读不了二是init-file只在数据库初始化阶段执行所以必须先停掉正在运行的服务再手动启动带该参数的进程而不是在服务运行中动态调用。3.3 error 1045 (28000) access denied 的系统排查热搜词里出现频率非常高的error 1045 (28000): access denied for user rootlocalhost (using password: YES)其实不光是密码错误这背后的原因比你想的多得多。最常见的当然是密码本身不对。但很多人忽略了一点rootlocalhost和root10.0.0.%是两条不同的账户记录权限和密码可以完全不一样。MySQL 在验证身份时同时看用户名和来源主机如果你当时创建的是root%只在rootlocalhost上改密码是没用的。排查思路按这个顺序来第一步确认连接方式。mysql -uroot -p默认走的是 Unix socket而mysql -h127.0.0.1 -uroot -p走的是 TCP。某些系统上 root 只允许 socket 登录走 TCP 就会被拒。如果配置了bind-address127.0.0.1问题不大如果绑定了其他地址还得看防火墙。第二步进入skip-grant-tables模式直接查用户表SELECT user, host, plugin, authentication_string FROM mysql.user WHERE userroot;看有没有多行 root 记录、认证方式是什么、密码哈希是不是空。如果plugin是auth_socketMariaDB 常见那你用密码登录永远都会失败因为这种插件根本不要密码只要操作系统的调用者是 root。第三步处理密码过期问题。MySQL 5.7 之后的版本可以给密码设置有效期到期后即使密码正确也会报 access denied。连接时会有PASSWORD EXPIRED提示此时执行ALTER USER rootlocalhost IDENTIFIED BY 新密码 PASSWORD EXPIRE NEVER;这个顺手就把过期问题一起解决了。我在处理过几次类似报错之后已经养成了随手检查插件和 host 字段的习惯这两项比单纯怀疑“密码忘了”更值得先确认。3.4 MariaDB 与 MySQL 认证插件的差异MariaDB 到了 10.4 版本之后默认的 root 认证方式改成了unix_socket。这个插件的中文意思就是“用 Unix socket 来判断身份”——只要你以操作系统 root 用户身份登录不需要输入任何密码就能直接进入 MariaDB 的 root 账户。这就引出了一个非常常见的问题你明明没设置过 MariaDB 的 root 密码为什么mysql -uroot -p输入什么都是 access denied因为你是在普通用户下执行的socket 验证认为你不是 root用密码当然不对。解决办法是直接sudo mysql以 root 身份执行 mysql 客户端就可以直接进。进了之后如果想改成密码认证ALTER USER rootlocalhost IDENTIFIED BY 新密码;MariaDB 会自动把认证方式从unix_socket切换为密码认证。如果你用UPDATE mysql.user SET authentication_stringPASSWORD(...)这种老办法光改哈希还不够还要注意plugin字段是否匹配否则改了也白改。MySQL 8.0 这边则默认使用caching_sha2_password插件如果老客户端不支持这个插件也会报认证失败。这时候可以在 MySQL 里显式指定ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 新密码;这些差异在网上教程里很少被讲清楚但实际工作中遇到频率相当高。如果你在重置完密码后依然连不上优先怀疑认证插件而不是怀疑密码设置步骤。4. 中间件和 Windows 场景下的密码重置补充4.1 Elasticsearch 内置用户密码重置Elasticsearch 开启安全认证后内置超级用户elastic的密码如果忘了处理方式跟常规应用不太一样。ES 提供有专门的用户管理命令行工具可以直接在安装节点的本地执行重置。拿 Elasticsearch 7.4.2 这个常见版本来举例ES 安装根目录下的bin文件夹里有一个elasticsearch-users工具/usr/share/elasticsearch/bin/elasticsearch-users userpasswd elastic -p 新密码这个命令的作用是直接修改本地文件中的用户信息不需要 ES 进程在线也不需要先通过 HTTP 认证只要你有系统层的读写权限就能执行。执行完成后新密码立即生效不需要重启 ES。如果你的 ES 版本后续升级过比如 7.6 之后官方又提供了更专门的elasticsearch-reset-password工具交互式运行/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -i它会提示你输入新密码。两种工具选其一即可关键是执行的时候以 ES 安装用户通常是elasticsearch的身份或者确认有对应目录的写权限不要用 root 强改文件权限否则 ES 可能起不来。另外要注意ES 的密码策略默认要求至少 6 位太长复杂字符串如果超出了内置验证规则也可能被拒绝重置时尽量用一个符合常见强度要求的密码就好。4.2 Artifactory 本地管理员密码重置思路Artifactory 这类制品仓库系统管理员密码遗忘后的重置路径比较偏门官方文档里翻半天常常找不到一个明确的按钮。我从实际案例中总结出一个通用思路Artifactory 的本地用户信息由 Access 服务统一管理本质上存在 Access 自带的数据库当中。如果你遗忘了 admin 密码且没有其他可用管理员账号最直接的操作是停掉 Artifactory 服务备份$ARTIFACTORY_HOME/access目录下的数据文件然后清空或重建 Access 服务中的本地用户存储让系统重新初始化默认的admin账号。重启后 Artifactory 通常会恢复初始密码状态再用默认凭据登录进去之后立刻改密码并重建用户权限。这招好用但也危险。因为重置后本地用户列表可能一并被清理如果你们用 Artifactory 自带的本地用户体系而不是对接 LDAP那所有本地用户都会受影响。所以操作前一定要和团队确认用户来源并且备份好数据目录。如果是 LDAP 接入通常不会走 Access 本地用户直接用 LDAP 管理端重置密码会更安全。我的建议是这种场景先登录 Artifactory 所在服务器看有没有配置 LDAP有的话优先走 LDAP 侧重置而不是动 Access 库。4.3 Windows 系统管理员密码重置winPE 与 Utilman 替换法Windows 下管理员密码忘记做法和 Linux 完全是另一套。这里说一个我在装机维护时经常用的方法利用 winPE 启动盘进入系统替换“轻松使用”按钮背后的程序。先制作一个 winPE 启动 U 盘或者用任何 PE 工具盘启动机器。在 PE 环境下打开命令提示符找到系统的 Windows 安装盘符一般不是 C要根据分区结构判断。然后执行copy /y C:\Windows\System32\utilman.exe C:\Windows\System32\utilman.exe.bak copy /y C:\Windows\System32\cmd.exe C:\Windows\System32\utilman.exe重启进入正常系统的登录界面点击右下角的“轻松使用”辅助功能图标正常情况下应该会弹出一个命令行窗口。在这个窗口里执行net user Administrator 新密码如果管理员账户被禁用了顺手再启用net user Administrator /active:yes执行完关闭命令行直接输入新密码登录即可。操作完成后最好再进一次 PE 把备份的utilman.exe.bak还原回去避免辅助功能按键被永久替换成命令行。这套方法只适用于 Windows 本地账户。如果这台机器登录的是微软在线账户密码只能通过微软账号的在线渠道重置net user改不了。另外如果系统盘启用了 BitLockerPE 环境下看不到盘需要先解锁 BitLocker否则上面的文件操作全部无效。这是 Windows 密码重置中最容易踩的两个坑提前避掉能省很多时间。5. 常见问题与避坑速查5.1 高频报错对照表每次帮别人处理密码问题来来回回都是那么几个报错。我把它们整理成一个速查表建议收藏遇到问题直接对着查。现象 / 报错常见原因解决方向rd.break 进环境后改密码提示只读/sysroot未重新挂载为 rw执行mount -o remount,rw /sysrootCentOS 改完密码重启登录不了SELinux 安全上下文未更新重置后执行touch /.autorelabelUbuntu 开机按 Shift 进不了 GRUBUEFI 模式 GRUB 等待时间过短使用 Live CD 启动后chroot修改mysql 报 error 1045 (28000)密码错误 / host 不匹配 / 插件不符用skip-grant-tables进库查 user 表MariaDB root 密码“总是错”unix_socket认证插件用sudo mysql登录后改密码认证MySQL 8 客户端连接认证失败caching_sha2_password与旧客户端不兼容IDENTIFIED WITH mysql_native_passwordWindows 通过 net user 改不了密码登录的是微软在线账户走在线账户重置或创建本地管理员重置完密码后自动化任务全挂了脚本中硬编码了旧密码全局搜索旧密码并更新凭据Elasticsearch 重置密码后仍登录失败工具权限不足或版本不匹配确认用 elasticsearch 用户执行或改用它自带的 reset 工具这张表只是索引具体操作细节还是参考上文对应章节。5.2 独家心得重置之后立刻要做的几件事密码重置是个高风险的运维动作我一般在确认能登录之后不会立刻把这事算了还会接着做几件收尾的事。第一件事开两个会话互相盯着。重置成功后先不要关掉当前窗口再开一个新的终端用新密码重新登录一次确认两个会话都正常。这一步能防止一些极端情况比如密码确实改成功了但某些服务或会话管理组件有问题导致新会话登录异常你还有旧窗口可以补救。第二件事把所有可能引用到 root 密码的地方查一遍。备份脚本、监控脚本、自动化部署工具的凭据库、Ansible 的 vault 文件搜索所有可能硬编码密码的位置。这一点之前我在速查表里提过但值得单独再强调一遍因为密码重置的“后遗症”往往比“忘了密码”本身更隐蔽而且会在某个深夜定时任务跑挂的时候才暴露。第三件事把新密码存进团队共用的密码管理工具里。运维靠个人记忆和便签来管 root 密码迟早要出事。以我自己的经验openssl rand -base64 24生成一个高强度随机密码存到密码管理器或者公司内部加密的凭据管理系统中比用一串“容易记住”的生日、拼音安全得多。第四件事如果这次重置是因为人员变动或者密钥泄露引起的不要只重置 root相关的服务账号、SSH 密钥、数据库账号最好一并轮换。密码重置不是目的收窄暴露面才是真正的目的。一次到位总比下次再被同样的原因折腾一遍要舒服。最后再分享一个小技巧。给 Linux 系统重置密码时如果担心自己手忙脚乱记不住步骤可以把这套流程压缩成一句话写在笔记里进 GRUB、加参数、挂载可写、chroot、passwd、autorelabel、重启。七个动作每个动作都补充一下可能遇到的报错遇到现场问题再翻详细步骤。我不少同事都是靠这句话救急的在机房蹲着的时候根本没心思去看长篇文档。