🗒️Fedora CoreOS 实践
2023-7-4
| 2023-7-4
0  |  Read Time 0 min
type
status
date
slug
summary
tags
category
icon
password

学习时间

Jul 1, 2023 -

学习计划

  • Jul 1, 2023:完成 Fedora CoreOS 的安装与部署
  • Jul 4, 2023:尝试使用 Fedora CoreOS 上的各种容器

学习内容

  • 了解什么是 Fedora CoreOS
  • 了解怎么编写 Fedora CoreOS Configuration(FCC)
    • 了解 Butane 用法
    • 怎么导入 VMWare 机器
      • 怎么修改导入后的配置文件
        • (无法直接修改,在首次启动后就会固定下来)
        • 通过远程修改配置文件(已完成)
        • 使用QEMU(也做不到,因为Ignotion仅首次启动有效)
    • 怎么安装软件
      • rpm-ostree
        • 怎么搜索
  • Fedora CoreOS 系统内的容器
    • Docker
    • Podman
    • Podman
  • 了解 CoreOS 的原理
  • 了解怎么跨架构使用 CoreOS

什么是 Fedora CoreOS(FCOS)

一个自动更新的、最小的、整体的、以容器为中心的操作系统

对FCOS的初印象

有点像NixOS,都是以配置文件来配置系统。但是FCOS的Ignotion仅在首次启动的时候有效,而NixOS可以随时修改并生成。以至于我在折腾VMWare的时候,写了一个脚本连续导了几次ovf,每次都要重复修改并重新导入,十分麻烦。目前的临时解决方法是,通过远程下载ignotion,然后在首次启动前打快照,以后修改就直接修改远程Ignotion的内容并重启就可以实现重新部署了。看起来像是为了最小化跑起来Linux的产物,所以就要求去除多余的依赖包,仅通过配置文件配置自己必须的软件包和配置来实现初次配置。
发现一个很神奇的容器环境 Fedora Toolbox,查询后得知是基于Podman的,而且直接使用宿主机的用户,应该是自动做好了宿主机环境和容器环境的文件映射,似乎是为了让用户能够安装更多的环境在容器里,避免装在主机上而生的?在外边是没有dnf可以用的,只能用 rpm-ostree,安装完还要重启,似乎会进行一次类似镜像一样的打包。但是toolbox里面可以使用dnf,所以应该尽可能避免对宿主机进行更改。那么宿主机应该跑些啥呢?就是一个容器运行系统让大家尽可能运行容器(Run everything in container)?这么一想其实还挺帅的(
疑问在于,因为CoreOS仅在首次启动时运行Ignotion,那么后续进行软件包依赖的修改必须要重新Deploy一次新的主机?还是说部署CoreOS的情况下,目的就是只初始化一次以后我就不回去动它了?

安装与启动

生成ign配置文件

为了方便修改配置,这里使用 VMWare 来进行导入。
Fedora CoreOS | The Fedora Project 下载 Fedora CoreOS,选择 VMWare 镜像下载。
下载的同时,我们可以准备一下ign配置文件。我们仅仅是为了尝试一下,所以可以先开一个简单的带root权限的用户试试。先在一台有mkpasswd命令的电脑上跑一下,然后输入密码生成一个password_hash,像这样
生成完密码后,准备ssh公钥,我们就可以编写配置文件了。
当然,为了方便实验和回滚,我这里选择使用远程的配置文件。所以我还需要另外写一个配置文件用于导入到VMWare,以及方便的快照回滚来重新部署ign,避免重复地导入ovf。
编写好两份 Fedora CoreOS Configuration(以下简称FCC) 配置文件后,我们可以使用 butane 来生成ign文件。这里官方推荐你用 podman,我是无所谓啦~
在 Windows 上可以用 scoop install butane 安装,然后我们先运行
butane.exe --pretty C:\Users\Guoguo\Documents\VMs\Fedora\remote.fcc > remote.ign

导入到 VMWare

就会生成一个json啦~为了方便放入脚本中,可以先将ign文件进行一次base64编码,然后编写一个 import.ps1
注意这里ovftool的程序由于路径中有空格,所以要在前面加个 &,再替换FCOS_OVA变量为刚刚下好的ova文件路径,以及修改 $CONFIG_ENCODED 为刚刚编码完成的ign文件,修改一下想要存储的目标路径,就可以等待导入了。
再运行一次 butane.exe --pretty C:\Users\Guoguo\Documents\VMs\Fedora\example.fcc > example.ign ,将生成的文件放到我服务器网站目录 /var/www/html/playground 上,然后尝试访问,正确返回即可。
这时,C:\Users\Guoguo\Documents\VMs\Fedora\CoreOS\Fedora CoreOS 目录会生成两个文件,一个是 Fedora CoreOS.vmx,另一个是 Fedora CoreOS-disk1.vmdk,双击.vmx文件导入到VMWare。
不急着启动,先打个快照以便修改配置文件后回滚,然后就
Fedora CoreOS,启动!

Fedora CoreOS,启动!

伴随着一顿跑码,Fedora CoreOS 的第一次就这样被设置完成了,已经是 example.ign 的形状了,你也可以连接上去看看了。
notion image

后续配置

连接到 Fedora CoreOS

伴随着启动成功后,身体一阵哆嗦,突然变得索然有味。
notion image
然后进去一看,欸怎么连dnf都跑不了啊?这怎么装软件?
这就不得不提到全容器系统的含金量了。虽然我没有dnf,但是我有 docker,有podman,有toolbox,还有什么是我做不到的吗?

安装软件

在这个系统里没有方便的 dnf 和 rpm,有一个 rpm-ostree,但是一般不建议用这个来安装一些类似 PHP/Python 这样的软件,具体可以参照 Mogeko’s Blog 在 https://mogeko.me/posts/zh-cn/103 中的描述
其实,Fedora CoreOS 中存在类似于「表」、「里」两套系统,「表」系统,及运行中的、只读的那套系统;而「里」系统就是「表」系统的镜像。所谓升级 (安装软件) 就是把新的软件安装在「里」系统中,然后再在重启的过程中将「里」系统挂载为「表」系统。没错,在 CoreOS 中升级 (安装) 了新软件后,需要重启才能生效
换句话说,我们一般不在 Fedora CoreOS 上直接安装生产环境的软件,而是在容器中进行部署。所以,就发现了一个神奇的东西:Fedora Toolbox~

使用 Fedora Toolbox

它本来就不是想让你在上面直接运行程序的,作为一个极简的系统,它希望你通过容器来跑服务,使它所有的东西都不会脏到系统。不错,我喜欢!
使用 toolbox create 可以创建一个toolbox container,然后再 toolbox enter 就可以进入到神奇的toolbox里了。当然,toolbox enter 后面也可以跟label,这样就可以创建多个toolbox container。
这个toolbox container是基于podman的,不过使用起来其实自我感觉还挺不错,更重要的是可以允许你使用dnf来装一些软件和依赖了!于是你就可以在这个自己的小天地里面尽情地玩耍。
当然,你也可以在这个自己尝试编的neofetch RPM包下安装后尝试跑一编neofetch
notion image
不觉得这很酷吗,作为…(被打死)

玩耍

不如试试 rm -rf /* ?

听说 Fedora CoreOS 十分安全,来试试火之高兴 rm -rf /?
notion image
似乎 /etc/passwd 没了,也没法重启,尝试强制重启后开机?
然后登陆不进去了……
但是!在之前使用 rpm-ostree 进行了一次安装尝试,导致系统打了一次系统镜像备份,于是抱着死马当活马医的心态尝试切换了一下引导,神奇的事情发生了~
notion image
卧槽,活了,也能正常登录,猜测是系统镜像备份的时候将 /etc 也给镜像进去了,但是家目录是真没了,倒无所谓,可以重建,只能说很强大.jpg

安装可进行rpm编包的程序

在 Toolbox 内执行
sudo dnf groupinstall 'Development Tools'
 

跨架构(编译?开发?)使用 Fedora CoreOS

<等待更新>

疑问

  1. 正在使用的 Fedora CoreOS 是没有办法修改配置文件的吗?
    1. Fedora CoreOS 仅允许在第一次启动的时候使用 Ignotion 配置文件来配置系统。如果需要修改 Ignotion,那么只能够重新创建一个实例来重新下发配置。如果是学习用途需要重复地修改的话,可能使用远程配置文件来间接修改会方便一点?

参考资料

技术分享
  • Fedora
  • 学习
  • Linux
  • 运维
  • 在WSL上使用PHPStorm调试PHPRISC-V OpenEuler 环境搭建初体验
    • GitTalk
    Catalog