IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    使用 init 进程运行 Container

    Yiran\'s Blog发表于 2022-03-05 15:10:39
    love 0
    背景 链接到标题 关注过 Bare Metal 相关项目的同学应该都了解过系统的启动流程、如何快速的置备一台物理服务器等之类的实现方式,通常都需要运行一个 LiveOS 来实现某些动作。 在 Tinkerbell 项目中,使用 Linuxkit 来作为 LiveOS,Plunder 项目中使用 BOOTy 来作为 LiveOS。前几天 @thebsdbox 将 BOOTy 中的一部分抽离了出来,作为 ginit 展示主要的实现方式,可以更好的让我们理解安装环节中的具体细节。 今天来看一下这个项目。 如果安装一个 CentOS,那么通常是会通过 kernel + initramfs.img 启动,initramfs.img 中会包含 systemd 、anaconda、dracut 等一些列组件,然后通过 systemd 指定不同的 Target 所属/依赖/顺序来完成最终 Anaconda 调用。Anaconda 通过解析 /proc/cmdline 中的 KickStart 参数来决定自己的安装方式。 ginit 项目展示了以下内容: 制作 initramfs.img 通过 Container image 制作一个 RAW image 通过 QEMU 使用 RAW image 和 Linux Kernel 来运行一个虚拟机 ginit 自动运行 Container 中 entrypoint 指令 流程演示 链接到标题 通过 Container image 制作一个 RAW image 链接到标题 RAW image 中最终不会包含 Kernel 部分,以 Nginx Container 为例。提取 nginx:latest image 中的 Entrypoint ,通过 dd 置备一个 RAW image,并格式化为 ext4 ,raw image 作为 loop 设备挂载到本地,通过 docker export 将 Nginx Image 拷贝到挂载点下,卸载挂载点,最终 RAW image 包含了 Nginx Container 的所有内容。这里的 RAW image 因为不包含 kernel,所以无法直接启动,只是作为后续动作的依赖。


沪ICP备19023445号-2号
友情链接