905
京東網上商城
Golang 退出chroot環境的方法
chroot()是用linux的係統函數,能改變程序運行時參考的根目錄。安裝係統或者通過引導盤進入恢複係統時,可以通過chroot()修複GRUB,或者安裝軟件。
Golang的syscall包提供Chroot()方法。
但進入chroot環境後,如何退出呢?目前我就碰到這個需求。翻遍syscall包,也沒看到直接的退出方式。Google後發現,不止我一個人想這麼做。有篇文章 給出了python的hack方案。照貓畫虎,我用go試著做了一遍:
// hold our real root's file descriptor for switching back later
oldRootF, err := os.Open("/")
defer oldRootF.Close()
if err != nil {
glog.Warningf("fail to open root: %v\n", err)
}
// change working dir to old root
err = syscall.Chroot("/mnt/install")
if err != nil {
glog.Warningf("fail to chroot %v\n", err)
}
// do some stuff in new root
// switch back
err = oldRootF.Chdir()
if err != nil {
glog.Warningf("chdir() err: %v", err)
}
err = syscall.Chroot(".")
if err != nil {
glog.Warningf("chroot back err: %v", err)
}
其中的把戲在於,切根之前先保存舊根的文件FD。等到要切回來時,先把當前工作目錄切回舊的根目錄,再chroot到當前目錄。
最後更新:2017-04-07 21:05:50