2010年6月7日 星期一

使用 Chroot 來混用 Ubuntu 10.04 TLS 和 Ubuntu 8.04 LTS

Ubuntu 是個非常流行而且算是主流中的主流(?)的一種Linux發行版,也就因為是主流中的主流,所以其實 Ubuntu 中的套件裡面軟體都非常新(不過Ubuntu當一個版本Release後,通常就不會升級裡面軟體的版本主要版本了,通常只進行bugfix 和 patch number的更新),這對很喜歡用新版的Linux使用者來說,算是一種福音。(當然,如果很喜歡用最新版而且非常想更新主要版本的使用者,通常會選擇Gentoo+使用~符號來嘗鮮)。版本新是很好,可是對軟體開發者來說,卻有個非常重大的缺點,那就是開發出來的二進制的散佈問題。

或許有的人會問:「那就用 static link 就好了阿,這樣不是一切都解決了?」姑且不提有些函式庫就是沒辦法 static link,還是某些發行版為了 license issue ,所以只提供了share 版本的函式庫 ,其實static link 並不能完全解決二進制散佈問題。聽到筆者這樣說,或許這樣大家就會問了:「static link 不是把所有的東西拉進來了嗎?而且理論上是 Self-contain 的,為什麼還是會遇到問題?」簡單的說,在編譯的時候即使使用了 static link,很清楚的地方是,其實 kernel 並沒有被拉到執行檔內,這樣的話static link的二進制檔嚴格來說是跟 kernel 有些相依性的。

什麼是跟 kernel 有些相依性,程式開發人員都知道,跟 Linux 打交道的方法就是透過 system call,linux 中的 libc (glibc, eglibc, uclibc and bionic) 就是提供了 C 語言跟 linux kernel 系統呼叫的一個橋樑,為了效能上的考量,新版的 libc 通常會使用某個版本以上的 linux kernel 才提供的 syscall,這樣會造成即使是static link的二進制,也需要在某個版本以上的Linux Kernel才能執行。以Ubuntu來說,8.04 編譯出來的檔案至少要使用2.6.8以上的Linux Kernel才能執行,而10.04卻需要2.6.18以上的Linux Kernel才能執行,這個差距足以讓那些 Red Hat Enterprise Linux AS release 4 或是 Cent OS 4.6 的工作站無法執行在Ubuntu 10.04 開發出來的二進制。

如果想要升級到 Ubuntu 10.04 LTS 卻害怕相容性問題,想要使用新版本的軟體來開發程式卻想使用 Ubuntu 8.04 LTS 來編譯程式的話,或許有人會想用使用Dual Boot,可是其實不需要那麼麻煩, chroot 就是你的救星! 參考 Gentoo的作法 ,先將Ubuntu 8.04 安裝在某個分割區,然後使用Ubuntu 10.04 開機後,掛載 8.04 的分割區後,執行以下的程式碼 (假設 8.04 的分割區在被掛載在 /mnt ),然後再執行 chroot /mnt /bin/bash ,就能輕鬆享用 8.04 的環境。

# mount -o bind /dev /mnt/dev
# mount -o bind /dev/pts /mnt/dev/pts
# mount -o bind /dev/shm /mnt/dev/shm
# mount -o bind /proc /mnt/proc
# mount -o bind /proc/bus/usb /mnt/proc/bus/usb
# mount -o bind /sys /mnt/sys

沒有留言:

張貼留言