2010年7月26日 星期一

chroot初體驗

chroot是linux上一個可以讓你限制根目錄的有趣指令。在unix的世界裡,萬物的源頭就是/,就算是/的上一層目錄也還是根目錄本身。也就是說,任何使用者都無法離開/,就像是你永遠跨越不了宇宙的邊界,除非你已經不屬於該宇宙的一部分。

今天研究室學妹laptop上的opensuse遇到了一個有趣的問題。開機到stage2之後,無法掛載根目錄,其錯誤訊息是:『unknown "reiserfs" filesystem』。這在Redhat系列的linux並不意外,因為他們並不打算讓使用者不自訂kernel的情況下去使用reiserfs以及reiser4。反之,opensuse則是預設以reiserfs為檔案系統。很顯然是kernel不認識這個filesystem,但是是什麼原因使得kernel不認識filesystem呢?

我只是合理的猜測--更新kernel的過程中,或是在執行SuSEConfig之前更新的process被中斷。後來學妹也說因為太久沒更新,結果更新的清單一大疊,很可能是因為要回家前更新還沒有完成,所以就中斷這個process。跟Debian不同:Debian的更新是把所有的套件都抓下來之後再逐個安裝,Redhat/SuSE系列則是下載一個安裝一個,或許恰好是在安裝新的kernel時被終止,留下了一個沒有設定完成的kernel。

由於根檔案系統無法被掛載,我只剩下最基本的ls/mount等指令可用,連關機都不行@_@||| ...在Debian的liveCD裡,我無法利用rpm或是yast替opensuse安裝一個新的kernel上去;於是,我想到chroot。

mkdir /Virtual
mount /dev/sda1 /Virtual
mount --bind /proc /Virtual/proc
mount --bind /sys /Virtual/sys
mount --bind /dev /Virtual/dev
chroot /Virtual
這個時候,我就擁有了opensuse的環境,雖然此時此刻所使用的kernel是debian的。由於我急著希望有一個可以正常開機的kernel,因此就先更新kernel吧!
zypper update kernel-default
Debian重開機之後,原本的硬碟載入grub,到了stage2就可以成功掛載root檔案系統了!第一次使用chroot就有不錯的經驗,chroot真是好物!

延伸閱讀:
Tetralet大哥的好文:使用 debootstrap 來建立 CHROOT 環境

沒有留言: