前言
使用Linux系統,有時候我們會忘記密碼,這時候就會無法登入,此時就必須要在開機時做一點手腳,然後由『Single mode』去修改密碼。
不過你也許會想,這樣不就是只要接觸到你電腦的人,都可以藉由這種方式來取得你的root嗎?@@,所以這就是為什麼有些公司的重要機房都會管制,以防止被竊取資訊(然後有些駭客就必須要爬杜拜塔進去機房.....,阿~對不起,我電影看太多了~~=.=)。
Menu entries可以藉由在開機之前修改參數,然後在傳遞這個參數到Kernel裡。要進行這個動作,就必須要用到『menu entry 編輯介面』,底下主要紀錄一下『Ubuntu』和『Redhat』怎麼進入Single Mode的。
Ubuntu 16.04
在Ubuntu裡,開機時按著「shift」就會進入Boot Menu,但是像我自己曾遇到,狂按著「Shift」還是不會進去,所以這時候就必須要強制打開它,請修改檔案「/etc/default/grub」,將這一行如下圖一樣註解掉「GRUB_HIDDEN_TIMEOUT=0」,然後儲存後在更新grub table:
update-grub
這時候重開機後就會看到Boot Menu在倒數了:
接下來就是選擇你要的系統上按「e」進入編輯,然後在如下的地方帶入額外的參數「single」以後,直接按「Ctrl+x」或是「F10」以這份修改後的Boot Table開機:
重開機後你就會看到進入single mode了,接下來如下一樣,使用指令「passwd」修改密碼,然後在用「reboot」或是「init 6」重新開機後,在用你的新密碼開機瞜~。
RetHat
從RHEL7開始,grub版本就變成『grub2』了,所以這邊需要分成兩個部份來介紹:RHEL6.X 的『grub』和 RHEL7.X 的『grub2』:
RHEL 6.X
在這個介面,選擇你要啟動的OS版本,按下『e』鍵修改,像這個例子,只有一個版本,所以不需要選擇,直接按下『e』就好。
按下去以後,就會跳進去下一個表單,像這個例子來說,有三行資訊,第一行是我的root file system的磁碟位置,第二行為kernel image的印象檔檔名和傳入參數,第三行則是initrd印象檔的檔名。我們想要修改的是kernel的傳入參數,所以選擇第二行後再按『e』。
進來之後就會看到比較細節的參數資訊了,這時候請在此行最後面加入一個『single』或者是『1』都可以,這邊記得跟前面的參數之間要隔一個空格,然後按下『Enter』儲存改變後回到上一層。
回到上一層以後,在按下『b』鍵,代表用這個修改過的『Menu entry』來開機,但是記得,這個只是對於這一次的開機,也就是說,你下次開機後,你剛剛修改的值就會消失恢復成預設值了。
按下『b』以後,你就會看到一堆的開機程序,然後就進入root了,這時候你只要簡單的輸入:
passwd
修改你的密碼以後再輸入
reboot
或是
init 6
就可以用你的新密碼開機了
RHEL 7.X
RHEL7.X的grub2會有一點點不太一樣,主要差異是『SELinux』和『systemctl』。開機後一樣,看到boot menu後,移到你要的版本上按下『e』鍵:
然後你就會發現在比較進階的資訊,這些資訊其實都是在檔案『/boot/grub2/grub.cfg』裡面的內容,接下來你要找到讀入kernel檔案的那一行,將『rhgb quiet』取代成『init=/bin/bash』,然後按下『Ctrl+x』用這個組態開機以後就會進入到Single Mode了,如下圖:
一旦你進入Single Mode以後,你的root的分區(Partition)將會是唯獨(read only)的狀態,你可以藉由底下指令來確認:
mount | grep root
這時為了要將這個partition改為可以寫入的狀態,所以我們必須要重新掛載(remount)成Read/Write的模式:
mount -o remount,rw /
然後再次確認:
mount | grep root
掛載成Read/Write 模式以後,我們就可以改root的密碼了,請輸入『passwd』:
passwd
如果你的系統的Selinux是開啟的話,你就必須要在執行底下這個步驟,來重新修改SELinux的內容,否則你的密碼將不會生效:
touch ./autorelabel
接下來只要重開機就好了,你就可以使用你新的密碼開機了:
exec /sbin/init
Ref: