# 介绍
### 官网:
https://nestos.openeuler.org/
### 当前支持的release (x86_64 arm64):
```
【22.03-LTS】
【22.09】
【22.03-LTS-SP1】
【23.03】
```
### 特点:
- 云底座操作系统
- 使用rpm-ostree替代yum(可以看成是rpm和ostree的结合体。一方面它提供了基于rpm的软件包安装,另一方面它提供了基于ostree的操作系统更新升级)
- 支持ignition配置: 安装到硬盘的配置文件(用户、密码、组、Authorized_keys等)
- 采用双系分区、原子化更新的设计
- 使用nestos-assembler(开源可二开)快速集成构建
- 自带docker,针对K8S、openStack、OKD等平台进行适配
- 与centos8相比容器启动速度提升了30%,容器创建速度提升了60%
- 适合作为以容器化应用为主的云场景(管理结点、大数据、AI运算结点等)
### 文件系统
- 在rpm-ostree的文件系统布局中,只有/etc和/var是可写的目录,/var只在升级过程中共享。升级将会接收/etc中新的默认文件。
- Ostree旨在并⾏安装多个独⽴操作系统的版本,存在/ostree/deploy/$STATEROOT/$CHECKSUM 及/ostree/repo中。每个部署主要由⼀组指向存储库的硬链接组成,这意味着切换版本可避免重复数据的变更,升级过程中只消耗了与新⽂件成⽐例的磁盘空间加上⼀些恒定的开销。
- OS只读内容保存在 /usr 中,以防⽌⽆意损坏的代码,部署之间/var 共享的可供读写的⽬录。Ostree核⼼代码不触及该⽬录的内容,如何管理和升级状态取决于每个操作系统中的代码。
### 系统扩展 VS 容器服务
- 例如驱动软件,VPN, kubelet等等,这些包视为拓展,通过rpm-ostree命令安装到/usr
- 容器化的服务,通过docker image来提供,安装到/var
### 性能对比测试:
https://gitee.com/openeuler/NestOS/blob/master/docs/zh/usr_manual/%E6%80%A7%E8%83%BD%E5%AF%B9%E6%AF%94%E6%B5%8B%E8%AF%95.md
# 使用
### 安装流程:
- live启动
- 执行install (https://gitee.com/openeuler/nestos-config/pulls/30)
该脚本会提示输入用户名密码,然后自动安装到硬盘并重启
### 多版本切换演示
- 安装软件包: rpm-ostree install wget && systemctl reboot (更改应⽤于新部署,重新启动才能⽣效。)
- 重启系统后,可通过键盘上下按键选择rpm包安装完成后或安装前的系统状态,其中【ostree:0】为安装之后的版本
- 检查状态,确认此时ostree有两个版本,分别为LTS.20210927.dev.0和LTS.20210928.dev.0
![[企业微信截图_16856868924556 1.png]]
- 系统回滚: 当⼀个系统更新完成,之前的NestOS部署仍然在磁盘上,如果更新导致了系统出现问题,可以使⽤之前的部署回滚系统。要临时回滚到之前的OS部署,在系统启动过程中按住shift键,当引导加载菜单出现时,在菜单中选择相关的分支;永久回滚时先登录到⽬标节点,运⾏rpm-ostree rollback,重新启动后回滚到更新前的系统。
- 版本选择:在上一步将NestOS回滚到了LTS.20210927.dev.0版本后,可以通过命令将LTS.20210927.dev.0切换为LTS.20210928.dev.0版本:rpm-ostree deploy -r LTS.20210928.dev.0
### 系统自动更新
- rpm-ostree在更新操作系统的时候会有2个bootable区域,一个是更新前一个是更新后的,更新升级只有在重启操作系统后才生效。如果软件安装或升级出现问题,回滚和重新启动会使NestOS系统返回到先前的状态。我们可以查看NestOS的“/ostree/”和“/boot/”目录,它们是ostree repository环境和boot使用的那个ostree。
- zincati通过cincinnati提供的后端来检查当前是否有可更新版本
- 若检测到有可能新版本,会通过rpm-ostree进行下载
- cincinnati根据配置的json文件的版本号、commit号等信息生成一个有向无环图(更新路径)
- 配置文件:/etc/zincati/config.d/update-cincinnati.toml
- 相应服务:systemctl restart zincati.service
### K8S+iSulad 搭建
- rpm-ostree install isulad kubelet kubeadm kubectl ntp ntpdate wget
- 修改/etc/isulad/daemon.json
- 详细流程可见:https://1.203.97.152/PublicResources/NestOS.pdf
# 构建
### 文档:
https://gitee.com/openeuler/NestOS/blob/master/docs/zh/devel_manual/nestos-assembler%E7%BB%84%E4%BB%B6%E5%88%86%E6%9E%90/nestos-assembler%E7%BB%84%E4%BB%B6%E4%BB%8B%E7%BB%8D.md
### Nestos-config
- manifest.yaml 编辑releasever reporef
- manifests/shared-workarounds.yaml 编辑ostreeversion k8sversion os-release内容等
- overlay.d/06nest/etc/ostree/remotes.d/openEuler.conf 编辑repo源地址
### Nestos-assembler
![[ef5ccaafc89747f68ea24b460a7b8dc.png]]
- 下载nestos-assembler镜像,
- 进入镜像执行nosa init <nestos-config地址>,把nestos-config项目的内容展开到镜像中的src目录
- 进入nestos-config目录执行nosa fetch --update-lockfile
- nosa build
# 当前问题
### 脱离上游的变更包
与openEuler相比,nestos累计改了差不多20个包。因为nestos中不包含python、perl这种组件,社区很多包在引入之初依赖很粗糙,所以为了精简体积进行了更细粒度的拆分。但是很多包已经在当前LTS版本里开始使用了,改起来很麻烦,所以目前的做法是单独维护,提PR争取合入下个LTS版本主线。
- gnutls、crypto-policies、fwupd、sssd下开放的pr
例如:https://gitee.com/src-openeuler/sssd/pulls/78
### 构建及定制化方面的文档及流程还不健全
这也是合作共建的目标,用实践趟平道路
- 替换版本号、发行版号、repo等
- 使用自有源的kernel及package进行重构
- 发布自有更新源
### 与kubeOS的概念结合
https://gitee.com/openeuler/KubeOS/blob/master/docs/design/architecture.md
- 实质上就是用k8s替换了zincati
- zincati的版本号池:http://1.203.97.152/NestOS-repo/repo/refs/heads/
- k8s的版本号池:https://hub.oepkgs.net/harbor/projects/50/repositories/nestos
- 更新方式:rpm-ostree rebase <k8s的版本号>