Golang 退出chroot环境的方法

简介: chroot()是用linux的系统函数,能改变程序运行时参考的根目录。安装系统或者通过引导盘进入恢复系统时,可以通过chroot()修复GRUB,或者安装软件。 Golang的syscall包提供[Chroot()](https://golang.org/pkg/syscall/#Chroot)方法。 但进入chroot环境后,如何退出呢?目前我就碰到这个需求。翻遍sysc

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到当前目录。

目录
相关文章
|
Unix Go
Golang 语言中怎么拦截系统信号和优雅退出 http server?
Golang 语言中怎么拦截系统信号和优雅退出 http server?
78 0
|
JSON 缓存 Go
Golang 语言 Web 框架 beego v2 之控制器方法和输入输出数据
Golang 语言 Web 框架 beego v2 之控制器方法和输入输出数据
105 0
|
2月前
|
Go
Golang的math包常用方法
这篇文章介绍了Golang的math包中的常量和常用方法,并通过示例代码展示了如何使用这些常量和方法。
173 87
Golang的math包常用方法
|
3月前
|
Kubernetes Go API
构建 Golang 应用程序的实用方法
构建 Golang 应用程序的实用方法
|
4月前
|
Serverless Go C语言
函数计算产品使用问题之如何在Golang运行时环境中解决glibc依赖问题
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
6月前
|
Go
Golang深入浅出之-信号(Signals)处理与优雅退出Go程序
【4月更文挑战第23天】在Go语言中,使用`os/signal`包处理信号对实现程序优雅退出和响应中断至关重要。本文介绍了如何注册信号处理器、处理常见问题和错误,以及提供代码示例。常见问题包括未捕获关键信号、信号处理不当导致程序崩溃和忽略清理逻辑。解决方案包括注册信号处理器(如`SIGINT`、`SIGTERM`)、保持信号处理器简洁和执行清理逻辑。理解并正确应用这些原则能增强Go程序的健壮性和可管理性。
258 1
|
6月前
|
Go 开发者
Golang深入浅出之-Go语言方法与接收者:面向对象编程初探
【4月更文挑战第22天】Go语言无类和继承,但通过方法与接收者实现OOP。方法是带有接收者的特殊函数,接收者决定方法可作用于哪些类型。值接收者不会改变原始值,指针接收者则会。每个类型有相关方法集,满足接口所有方法即实现该接口。理解并正确使用这些概念能避免常见问题,写出高效代码。Go的OOP机制虽不同于传统,但具有灵活性和实用性。
46 1
|
Linux 编译器 Go
Golang 语言怎么安装多个 Golang 版本的环境?
Golang 语言怎么安装多个 Golang 版本的环境?
222 0
|
6月前
|
Unix Linux Go
Golang深入浅出之-信号(Signals)处理与优雅退出Go程序
【4月更文挑战第25天】Go语言中的信号处理关乎程序对外部事件的响应,尤其是优雅地终止进程。本文介绍了信号基础,如SIGINT、SIGTERM等常见信号,以及处理流程:注册处理器、等待信号、执行清理和优雅退出。强调了三个易错点及避免方法,并提供实战代码示例展示如何监听和响应信号。信号处理应简洁高效,确保程序健壮性和用户体验。
187 0
|
6月前
|
Go Java C++
Golang每日一练(leetDay0031) 解码方法、复原 IP 地址
Golang每日一练(leetDay0031) 解码方法、复原 IP 地址
66 0
Golang每日一练(leetDay0031) 解码方法、复原 IP 地址