
凌晨兩點你坐在空蕩蕩的機房里或者對著遠程控制臺屏幕發(fā)呆——ssh連不上sudo密碼不對root密碼試了幾十遍全部失敗而服務(wù)器上還跑著明天一大早要演示的環(huán)境。這不是段子是每個Linux運維和管理員遲早會遇到一次的至暗時刻。重置root密碼聽上去是個再基礎(chǔ)不過的操作但真到了需要它的那天你會感謝自己提前看過一篇像樣的實操記錄。這篇內(nèi)容就是圍繞“重置root密碼”這件事把常見思路、不同系統(tǒng)的操作步驟、容易踩的坑和替代方案一次講清楚。我盡量不寫得像說明書而是把每一步背后的“為什么”也帶上這樣你哪怕遇到的是冷門發(fā)行版也能靈活變通。適合兩類人看一是剛?cè)腴T、手里正好有一臺測試機的Linux新手照著走一遍就敢在真實環(huán)境里上手二是跟我一樣干運維的老手遇到特殊情況時可以翻出來對比一下排查思路。1. 為什么會被鎖在門外先搞清楚自己的處境重置root密碼不是無腦重啟進單用戶模式那么簡單。動手之前先想明白你是屬于哪種情況因為不同場景對應(yīng)的解決路徑完全不同用錯了方法輕則白忙一場重則把系統(tǒng)搞掛。1.1 常見的五種“被鎖”場景第一種純屬遺忘。密碼是自己設(shè)的但半年沒登錄root密碼早就忘到腦后了。這種最普遍也最好處理。第二種是密鑰登錄環(huán)境下私鑰丟失。很多人配好SSH密鑰登錄后就不再使用密碼時間一長私鑰文件丟失或損壞結(jié)果發(fā)現(xiàn)root密碼自己根本不知道因為從來沒設(shè)置過或者設(shè)置完立刻忘了。第三種密碼過期或賬戶鎖定。有些安全策略會強制密碼定期更換超過有效期賬戶就被鎖定這時候你輸入正確密碼也會被拒絕。第四種是被人為修改。比如前同事離職前改過root密碼又沒交接或者服務(wù)器上被植入過惡意腳本密碼被篡改。第五種是配置文件導致的登錄失敗。比如sshd配置里禁止了root密碼登錄或者PAM模塊配置有問題這時候密碼本身是對的但系統(tǒng)就是不讓你進。先判斷自己是哪一種再決定要不要走“重置”這條路。因為如果是配置文件問題重置密碼不一定有用得改配置才行。1.2 破解思路誰在系統(tǒng)里說了算Linux的啟動流程是這樣的固件BIOS或UEFI加載引導器引導器加載內(nèi)核內(nèi)核掛載根文件系統(tǒng)然后啟動第一個進程PID 1通常是systemd或者init再由它啟動所有服務(wù)。關(guān)鍵點在于內(nèi)核剛啟動完畢、第一進程還未執(zhí)行時系統(tǒng)不存在認證體系。換句話說如果你能在這個時間窗口里主動注入一些內(nèi)核引導參數(shù)讓內(nèi)核跳過正常的初始化流程直接啟動一個shell給你你就能以root身份對文件系統(tǒng)為所欲為——比如修改shadow文件里的密碼散列。這聽起來有點“黑客”但它本質(zhì)上就是系統(tǒng)維護的合法通道也是所有重置root密碼方案的核心原理。理解了這一點后面你看到任何引導參數(shù)都不會覺得玄乎。1.3 動手前的三條紅線第一重啟是個高危動作。服務(wù)器上可能有正在運行的服務(wù)、未落盤的數(shù)據(jù)庫事務(wù)、正在進行的大文件傳輸強行重啟會造成數(shù)據(jù)丟失或系統(tǒng)損壞。必須先評估業(yè)務(wù)影響最好在業(yè)務(wù)低峰期操作。第二不要在操作前就把自己逼到?jīng)]有退路。比如直接在生產(chǎn)服務(wù)器上實驗自己不熟悉的方案或者系統(tǒng)整盤加密但密鑰文件也備份在系統(tǒng)內(nèi)——這種情況重置root密碼會直接把系統(tǒng)變成“死盤”誰也救不了。第三任何修改shadow文件的操作都要做好記錄。改完密碼后如果機器能正常進入系統(tǒng)順手把重置過程和原因記到運維文檔里避免下次再犯同樣的錯誤。2. 動手前的準備工作你能控制到哪一步很多人急著找“如何重置root密碼”的命令卻忽略了一個前提——你得有辦法在系統(tǒng)啟動早期觸碰它。沒有這個前提后面的所有操作都是白搭。2.1 訪問方式盤點控制臺、帶外、密鑰你至少需要以下三種訪問方式之一才能繼續(xù)游戲物理控制臺也就是人站在服務(wù)器旁邊接上鍵盤顯示器或者在機房通過KVM設(shè)備操作。這是最原始但最可靠的途徑只要機器能上電你就有機會。帶外管理比如IPMI、iLO、iDRAC這類遠程管理卡。它們與操作系統(tǒng)無關(guān)即使系統(tǒng)崩潰了你依然能遠程看到屏幕、操作鍵盤就像人站在機房一樣。生產(chǎn)環(huán)境下的物理服務(wù)器強烈建議配置好這個關(guān)鍵時刻能救命。云廠商的網(wǎng)頁VNC。大多數(shù)云平臺在控制臺里提供“遠程連接”入口本質(zhì)上是一個Web版的控制臺給沒有公網(wǎng)IP的機器提供視角。重置root密碼時這個入口幾乎是必須的因為你沒法用SSH進入故障狀態(tài)下的機器。另外如果系統(tǒng)還能跑起來只是root的SSH登錄受限而你手頭有另一個有sudo權(quán)限的普通用戶那就不需要重啟直接su或sudo到root然后改密碼就行了。這條最輕松但前提是你得有那個普通用戶。2.2 備份與快照花5分鐘買一份后悔藥很多人覺得重置root密碼只是改一個字段不會動數(shù)據(jù)。話是沒錯但整個操作鏈條里包含重啟、引導參數(shù)修改、掛載文件系統(tǒng)、chroot這些環(huán)節(jié)任何一個地方手滑都可能造成破壞。比如你掛載文件系統(tǒng)時忘了先卸載就重啟RHEL 8上甚至可能觸發(fā)強制fsck嚴重時導致基礎(chǔ)分區(qū)損壞。所以我的習慣是在物理機上確保最近的備份有效可用或者至少關(guān)鍵數(shù)據(jù)目錄有副本在云平臺上先打一份快照。快照這東西平時你嫌它麻煩真出問題時它就是后悔藥。一份磁盤快照的成本遠低于數(shù)據(jù)丟失的代價。2.3 加密磁盤與SELinux兩個容易被忽略的攔路虎如果你的系統(tǒng)用了整盤加密LUKS引導時就需要先輸入加密密碼才能掛載根文件系統(tǒng)也就是在進入我們想要的shell之前多了一道鎖。在實際處理某個項目時我就遇到過這種局面root密碼忘了LUKS密碼也只有機主本人才知道結(jié)果只能走備份恢復路線重置root密碼這招根本用不上。所以當你啟動后看到屏幕提示輸入LUKS密碼時先別急著往下走——如果沒有這個密碼后續(xù)操作就先停一停。SELinux則是另一回事。它是Linux內(nèi)核自帶的強制訪問控制系統(tǒng)開啟狀態(tài)下會給文件打上標簽登錄時依賴標簽校驗。我們重置密碼時直接修改了/etc/shadow這個敏感文件它的SELinux上下文在部分場景下會被破壞重啟后可能出現(xiàn)SELinux拒絕或啟動異常。解決辦法是重置后順手touch一個/.autorelabel文件讓系統(tǒng)在下次啟動時自動修復標簽。后面我會在具體步驟里標注這一點。3. 各發(fā)行版實操一步步把root找回來下面進入正題。我會分別講CentOS/RHEL系、Ubuntu/Debian系的具體操作方式再給一個通用兜底方案。建議你先選定自己的系統(tǒng)跟著步驟走一遍全部理解后再考慮實際部署。3.1 CentOS/RHEL系rd.break引導參數(shù)法以CentOS 7/8為例這是我在生產(chǎn)環(huán)境里最常用的方法。第一步重啟系統(tǒng)。在GRUB引導菜單出現(xiàn)時選中要啟動的內(nèi)核條目通常是最新的那個按下字母e進入編輯模式。注意如果GRUB菜單沒出現(xiàn)可能是因為機器上GRUB_TIMEOUT設(shè)置成了0。這時候需要在開機時快速連按ShiftPageUp或Esc不同固件不一樣或者在BIOS設(shè)置里暫時把啟動等待時間調(diào)大。第二步找到以linux16或linux開頭的那一行通常很長包含vmlinuz、initrd等字樣。按下鍵盤End鍵跳到行尾在這一行末尾加一個空格然后追加參數(shù)rd.break追加后的效果類似這樣只看關(guān)鍵部分即可linux16 ... rhgb quiet rd.break第三步按CtrlX或F10啟動。正常情況下系統(tǒng)會進入一個名為switch_root:/#的提示符。這個環(huán)境很簡陋但它已經(jīng)是initramfs階段擁有root權(quán)限。第四步重新掛載根文件系統(tǒng)為可寫。默認情況下真正的根目錄被掛載在/sysroot下且為只讀我們需要把它改成可寫mount -o rw,remount /sysroot第五步切換進真實的根目錄環(huán)境。chroot在這里的意思是“切到另一個根目錄里操作”進入后你看到的就是完整的系統(tǒng)目錄結(jié)構(gòu)chroot /sysroot此時你已經(jīng)在真實系統(tǒng)的root shell里了??梢蚤_始重置密碼passwd root系統(tǒng)會讓你輸入兩次新密碼。如果想設(shè)置的是有sudo權(quán)限的普通用戶而不是root也能在這里直接處理后面不必再進入單用戶模式。第六步處理SELinux問題。如果你習慣開啟SELinux Enabled狀態(tài)需要創(chuàng)建自動重新打標簽的標記文件touch /.autorelabel如果不做這一步重啟后可能因為SELinux標簽異??ㄔ趩与A段。創(chuàng)建時先確認當前chroot環(huán)境根目錄下有這個文件項即可。第七步退出并重啟。exit reboot如果你在云平臺上操作這一步很關(guān)鍵——先退出控制臺VNC界面等待系統(tǒng)正常重啟完成再嘗試用新密碼登錄。3.2 Ubuntu/Debian系Recovery Mode救援模式Ubuntu在GRUB層面其實提供了更友好的途徑也就是Recovery Mode但它并不總是能直接使用。第一步重啟。在GRUB菜單出現(xiàn)時打開“Advanced options for Ubuntu”子菜單選擇帶(recovery mode)字樣的內(nèi)核條目。正常情況下啟動后會進入一個Recovery菜單文字界面里面有幾個選項resume、clean、dpkg、fsck、network以及我們需要的rootDrop to root shell prompt。用上下鍵選到root回車。第二步進入root shell后根文件系統(tǒng)默認是只讀掛載的。先重新掛載為可寫mount -o rw,remount /第三步直接重置root密碼passwd root輸入兩遍新密碼即可。如果你在Recovery菜單里找不到root選項或者卡在別的界面就參考后面的通用方案。3.3 通用兜底方案init/bin/bash與systemd單元有的發(fā)行版沒有Recovery Mode也沒有rd.break機制這時候可以試試最“原始”的內(nèi)核參數(shù)法在GRUB編輯界面找到linux開頭的行在行尾追加init/bin/bash追加后按CtrlX啟動。正常會進入一個bash提示符而且是以root身份運行的但根文件系統(tǒng)同樣是只讀掛載你需要先掛載為可寫mount -o rw,remount /然后就跟前面的流程一樣passwd root就可以了。需要注意一點對于使用systemd的新系統(tǒng)來說init/bin/bash這個參數(shù)不一定總是好使有時候會出現(xiàn)掛載異?;颦h(huán)境變量缺失的問題。另一個更穩(wěn)妥的systemd方式是追加systemd.unitrescue.target或systemd.unitemergency.target進入救援或緊急模式再選擇root登錄。但這兩個模式有時會要求你輸入現(xiàn)存的root密碼才能進那樣就繞回了“密碼忘了”的原始困境。所以這類方案我通常只作為備選主力還是rd.break或Recovery Mode。3.4 密碼設(shè)置與驗證別急著重啟重置完密碼后很多人會興奮地直接重啟結(jié)果重啟后還是登錄失敗。其實原因很簡單passwd命令寫入的密碼因為PAM策略被拒了或者根本沒有寫入成功。我的做法是設(shè)置完密碼后先在同一環(huán)境下看一下shadow文件cat /etc/shadow | grep ^root正常應(yīng)該看到root行里有類似$6$...的字符串那就是密碼散列。如果看到的是!或*說明密碼賬戶是鎖定的或者這個字串不夠驗證格式passwd可能沒生效這時候打開檢查一下shadow配置比如lock機制再重新處理。如果系統(tǒng)對密碼強度有要求pam_pwquality太低級的密碼會被拒絕。建議直接用至少12位、包含大小寫和數(shù)字的強密碼。重置root密碼的意義就在于拿回控制權(quán)沒必要再給自己埋一個弱口令的雷。4. 折騰路上最常踩的坑問題排查實錄重置root密碼看起來步驟簡單但我在一線處理過的真實故障里至少有一半不是因為命令不會敲而是被周邊問題卡死的。下面這些坑我基本都親手踩過或幫人排查過。4.1 改完密碼重啟卻進不去系統(tǒng)現(xiàn)象密碼設(shè)置成功shadow文件里也確認有散列了重啟走完引導流程但登錄提示密碼錯誤或者直接卡在SELinux報錯。排查思路先確認你是不是真的進入了正確的系統(tǒng)。有些機器裝過多系統(tǒng)GRUB默認引導項不是你改的那個reboot后進入的是舊內(nèi)核或備份系統(tǒng)密碼當然對不上。檢查SELinux。如果你原本開著SELinux又沒有touch /.autorelabel會發(fā)現(xiàn)系統(tǒng)啟動過程中出現(xiàn)大量SELinux AVC拒絕對應(yīng)的日志最后掉進維護模式。解決辦法是在維護模式下重新掛載可寫根分區(qū)再創(chuàng)建autorelabel文件并重啟。檢查鍵盤布局。不要在控制臺里面用你手頭不同布局鍵盤輸入的字符因為終端環(huán)境下passwd和后續(xù)登錄可能走的不是同一套映射。這種情況不常見但在某些云廠商VNC里真的遇到過。4.2 passwd命令報錯或文件只讀現(xiàn)象在rd.break或Recovery Mode里輸入passwd root系統(tǒng)提示“passwd: Authentication token manipulation error”或者“permission denied”、“read-only file system”。這是我最常遇到的不當操作之一。前者的關(guān)鍵在PAM配置多半是chroot環(huán)境下的etc/pam.d配置引用了宿主機模塊路徑后者的原因幾乎都是忘了執(zhí)行mount -o rw,remount /或mount -o rw,remount /sysroot。記住單用戶和恢復模式的根文件系統(tǒng)默認只讀。遇到PAM報錯時可以先試一下繞過PAM直接編輯shadow文件不推薦但確實能用使用chroot /sysroot進去后如果passwd真的不可用可以用某種方式修改shadow。嚴謹一點我不會把這個當作正規(guī)方案但在緊急恢復時可以救人一命。正規(guī)路徑是先用更強的密碼嘗試passwd不行再排查pam配置。4.3 云服務(wù)器和物理機的明顯差異云服務(wù)器上重置root密碼與物理機一個很大的區(qū)別是你幾乎總是在云廠商控制臺的VNC里操作而不是直接在終端里。VNC延遲、鍵盤映射、鼠標交互都會讓人抓狂。比方說在GRUB編輯界面按e之后如果網(wǎng)絡(luò)有延遲按鍵會丟失看起來就像卡住了。這時候不要亂按等界面穩(wěn)定后再操作。另一個差異是云平臺一般有自己的官方重置密碼功能。這類功能實現(xiàn)原理各不相同有的是接管了虛擬機的虛擬軟驅(qū)或臨時啟動到一個工具環(huán)境有的是直接通過管理接口操作虛擬磁盤。很省心但你得注意兩個限制一是通常強制要求重啟才生效二是它只重置系統(tǒng)root賬戶的密碼對其他賬戶、SSH密鑰、配置項無能為力。此外某廠商的機器可能有“安全加固”服務(wù)默認禁止root密碼登錄或禁止root從SSH登錄重置完密碼后你會發(fā)現(xiàn)還是連不上SSH原因其實在配置文件里。應(yīng)對方法是重置完root密碼后把sshd_config里PermitRootLogin改成允許密碼的方式或者干脆用密鑰登錄。4.4 更多常見問題速查表現(xiàn)象可能原因處理方向GRUB菜單不出現(xiàn)GRUB_TIMEOUT為0或引導器被其他系統(tǒng)接管開機時按Shift/Esc嘗試喚起菜單或修改grub配置文件啟動到switch_root但看不到/sysroot掛載點內(nèi)核參數(shù)錯誤或磁盤設(shè)備名變化用lsblk或blkid查找真實分區(qū)再手動mount輸入rd.break后屏幕卡住該版本dracut行為差異或內(nèi)存不足回車幾次等待多半是網(wǎng)絡(luò)驅(qū)動加載慢可以加rd.skipfw等參數(shù)觀察chroot后passwd提示找不到libpamchroot環(huán)境中動態(tài)庫缺失換回完整的救援系統(tǒng)或Live CD環(huán)境密碼長度過短被拒pam_pwquality強度策略用位數(shù)字母特殊字符的強密碼重置成功后SSH還是登錄失敗sshd配置禁止root密碼登錄或監(jiān)聽端口未開放改sshd_config并確認監(jiān)聽地址和防火墻狀態(tài)服務(wù)器的根文件系統(tǒng)快滿了某些日志增長重置過程中fsck臨時文件正常登錄后清日志、擴展磁盤避免下次啟動階段fsck崩潰機器有LUKS加密封裝重置root密碼無法解決LUKS認證只能走備份恢復或找LUKS密碼5. 除了改內(nèi)核參數(shù)還有哪些路可以走如果你具備引導器操作條件重置root密碼用前面幾招就夠了。但有些環(huán)境確實不給你這個機會比如無法斷電的遠程VPS、物理機不在身邊且沒有帶外管理、引導器損壞或加密限制。這種時候就得考慮替代路徑。5.1 Live CD chroot最通用的兜底方案準備一個與系統(tǒng)同架構(gòu)、同大版本的系統(tǒng)安裝鏡像不管是U盤還是掛載到虛擬光驅(qū)從它啟動到Live環(huán)境然后掛載原系統(tǒng)分區(qū)chroot進去改成密碼。核心步驟 把原系統(tǒng)根分區(qū)掛載到/mntmount /dev/sda2 /mnt掛載偽文件系統(tǒng)目錄保證chroot環(huán)境里命令能正常運行mount --bind /dev /mnt/dev mount --bind /proc /mnt/proc mount --bind /sys /mnt/sys mount --bind /run /mnt/run如果有獨立的/boot分區(qū)或EFI分區(qū)也要一并掛mount /dev/sda1 /mnt/boot然后chrootchroot /mnt之后直接passwd root就可以了步驟和前面一樣。這種方案最大的優(yōu)勢是不依賴原系統(tǒng)引導器只要磁盤本身沒壞就能操作。缺點是耗時較長且要求你對磁盤分區(qū)結(jié)構(gòu)有一定了解。如果不知道根分區(qū)是哪個可以看lsblk或df -h。5.2 云廠商控制臺重置省心但有限制在云上我通常會優(yōu)先考慮廠商自帶的“重置密碼”功能尤其是那種支持后付費的云主機。它比你自己折騰GRUB安全得多因為它是由底層虛擬化工具直接修改磁盤里的shadow文件不會經(jīng)過你的引導界面也基本不會誤傷數(shù)據(jù)。但這個方案的局限也明顯一是它只重置root密碼不處理其他配置二是執(zhí)行后必須重啟重啟窗口需要自己把握三是如果你改動過sshd配置或禁用了root登錄重置后可能依然連不上四是某些加固鏡像還會在重置后把密碼策略再次恢復成原來的樣子。所以我的使用建議是把它當作“第一步”拿到可以被SSH登錄的root賬戶之后再根據(jù)具體需要去調(diào)整其他配置。5.3 日常防護把重置root密碼變成低頻操作經(jīng)驗告訴我與其等到危急時刻靠重置root密碼救命不如從一開始就讓這個場景盡量少發(fā)生。日常防護其實不復雜但很多團隊就是拖著不做。第一開啟SSH密鑰登錄并謹慎使用root賬號。正確做法是用普通用戶sudo來日常管理root密鑰只留一套離線備份并特別加強安全控制。第二為密碼找到可靠的“存放地”。公司在用密碼管理工具的把root密碼錄入進去個人用途的放到本地加密保險箱里而不是黏在便簽紙上。第三定期檢查服務(wù)器賬戶狀態(tài)。寫一個腳本每個月掃描一次/etc/shadow里root的密碼鎖定和解鎖時間、空密碼賬戶等特別是有多人共管的服務(wù)器。第四物理機一定要配置帶外管理。沒有iLO/iDRAC的物理服務(wù)器一旦系統(tǒng)宕機或密碼忘記你只能打車去機房。第五LUKS類數(shù)據(jù)盤加密時要單獨備份密鑰文件并離線保存。把LUKS密鑰和root密碼放在同一個系統(tǒng)里等于什么都沒有加密。最后說一句我個人在實操中的體會重置root密碼本質(zhì)上是在跟“系統(tǒng)初始化之前的空窗期”打交道。那段時間里你能做什么、不能做什么跟發(fā)行版、加密策略、啟動方式都有千絲萬縷的關(guān)系。所以平時搭建測試環(huán)境時不妨每個月故意拿虛擬機演練一次這個流程——把root密碼隨機改掉再通過不同方式找回來。別覺得浪費時間等真出事的時候你會感謝自己練過。說到底把這條路徑跑通、跑熟你才算真正對自己的服務(wù)器有控制權(quán)。