如何手动实现docker的文件系统切换功能

如何手动实现docker的文件系统切换功能,以下为穿刺案例。

以busybox为例:

从镜像仓库拉取busbox镜像

docker pull busybox

以此镜像运行一个容器,命令是top -b

docker run -d busybox top -b

使用export把容器导出tar包,83066ac5d6d0为容器id

docker export -o busybox.tar 83066ac5d6d0

创建 文件夹

mkdir busybox

手动解压到文件夹下即可

tar -xvf busybox.tar -C busybox/

以busybox为目录使用pivot-root改变当前文件系统

为了使得busybox的老root和新root不在同一个文件系统,需要mount一次,bind参数可以把内容带过去

mount busybox buxybox --bind

创建一个隐藏文件old-root存放旧跟目录

mkdir busybox/.old-root

使用pivot到新的rootfs,老的存储在.old-root中,而且里面可以看到内容,此时千万不能删除,会删除宿主机目录,(如果操作提示pivot_root: 将根目录从“busybox”更改为“busybox/old-root”失败: 无效的参数,可以先执行unshre -m)

pivot-root busybox busybox/.old-root

cd / 切换到新文件系统到根目录

对老文件系统根目录解绑定,使用-l 类似于MNT_DETACH,可以解决umount: can’t unmount /old-root: Device or resource busy问题

umount /.old-root -l

上一步unmount之后,.old-root目录即为空,此时可以删除了(切记,如果不为空,说明没umount成功,不可删)。这样一个崭新的文件系统出现了

rm -rf .old-root

把宿主机的procmount进来,可以使用top和ps -ef命令了,但是看到的是宿主机的内容。

mount -t proc /proc proc

以下为新的文件系统截图,根目录为busybox根目录,而非宿主机。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值