全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 1419|回复: 12
打印 上一主题 下一主题

有关Linux一键重装支持 Ubuntu 20.04/22.04 的技术细节1

[复制链接]
跳转到指定楼层
1#
发表于 2023-6-10 18:14:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本来想把刚才的使用文档和技术细节合并在一个帖子里的,但帖子字数超过限制了,所以单独开个帖子水吧。

Ubuntu自从18.04版本后,采用的自动部署方式和Debian开始分家,引入了一种叫cloud init的部署工具,说实话,这个产品很强,它的厉害之处是把不同发行版本Linux的自动部署配置格式从顶层加以统一的抽象化,说人话就是写一套相同的配置文件,云服务商就可以快速给一台机器布置Debian Kali Ubuntu AlpineLinux CentOS Almalinux RockyLinux Fedora等等Linux系统,用户名、密码、网络配置等等关键参数都由cloud init来处理,不需要云服务商运维自己定期给不同的Linux发行版制作各种不同镜像,由于该项目是开源的,现在很多云服务厂家后台都是用cloud init来部署镜像,应用范围很广,是非常强势的一种应用。

但是,Ubuntu的母公司Canonical在方便了云服务商的同时,却给普通用户造成了不小的麻烦,其中罪魁祸首就是把debian installer给移除。Ubuntu支持兼容Debian的安装方法从Ubuntu 20.04后就彻底放弃,Ubuntu 22.04仅支持读取cloud init格式的配置文件部署,不再与之前的debian installer兼容,这使得很多好用的,基于Debian安装方式部署Ubuntu系统的方式均已失效,我愿称之为Canonical损失了一大笔宝贵的遗产。

Canonical一意孤行的同时,却没有给普通用户一个好的替选方案,我的意思就是供用户下载一个很小的网络启动文件,然后从grub引导启动,启动文件读取相应的配置文件,然后连接镜像源,完成系统的原生自动化安装工作。目前可行的方案仅有两种:

1. 下载一个iso文件,烧录到外部存储设备,比如光盘或U盘,然后系统重启后从iso启动,读取cloud init进行自动化安装;
2. 从Ubuntu cloud images网站下载每周官方打包好的Ubuntu对应版本镜像,转换格式后挂载,对这个镜像里的系统进行一些定制,然后再将其unmount,像以前安装ghostXP一样,把镜像文件全盘解压到硬盘,在读取cloud init完成重启后的自动化部署。

注意,1中的Ubunt安装文件是被压缩的,安装时需要重新解压,和我刚才说的网络启动方式“原生”安装一个系统的原理是一致的,2中的Ubuntu是一个已经完全被释放出来的Ubuntu系统包,这个系统只要重写到硬盘里,就能作为一个系统独立启动,只不过如果不加以配置,它的用户名、密码、网络等都是默认的,装完了你也连不上去。

所以问题来了,对于一个只有单硬盘,无法挂载外部存储设备的vps来说,挂iso安装很明显是不现实的,独立于硬盘,可给对硬盘操作(格式化时硬盘不能自己操作自己)的存储设备就是内存,Debian、红帽系的网络安装都是基于加载在内存里的微缩系统来完成初始化,并往硬盘里写入系统、配置、启动的。既然Ubuntu暂时不提供网络安装选项,那么核心思路还是要先在内存里启动一个中介系统,才能保证后续操作最起码有可能。

煎饼哥的方式是采用AlpineLinux为中间系统,启动后用AlpineLinux给硬盘分区,预留一个存Ubuntu iso镜像的分区,然后给中间系统写入下一次从Ubuntu iso引导,再次重启后启动Ubuntu安装程序,读取cloud init配置完成后续安装,在新系统里还要埋一个自动扩展分区容量的脚本,否则新系统里会发现残留一个当时存储iso镜像的分区,以上步骤中,那个iso镜像分区就是“外部存储设备”,虽然它是虚拟的分区,不是额外的物理硬盘,也能完成预期效果。

我在思考和开发相关功能时,决定采取第二种办法,即简单修改一下Ubuntu Cloud images的内容,然后把它存放在服务器上,反正是Ubuntu官方每周构建的完整系统文件,兼容性和稳定性肯定值得信赖。然后启动中介系统,用dd方式将其下载并完全重写到目标硬盘,最后植入cloud init文件,让Ubuntu系统包完全释放到硬盘并重启后,按我预期的要求,完成自动化部署工作。我曾许下豪言说绝不自己提供存储镜像包的服务,结果犯了戒,唉真香了,因为装Ubuntu目前只有这种方法,没办法,我不怕打脸,挨打就要立正。

最初的中介系统选用的是和dd Windows一样的Debian 12,因为相比仅支持ipv4动态或静态启动的AlpineLinux来说,Debian 12可以以ipv4 ipv6任意静态或动态方式启动,兼容性无疑更强,但Debian installer的问题无疑是巨大的,包括但不限于:

1. Debian installer环境为busybox,一个超级精简的Linux系统,精简到什么程度呢?就连普通的grep sed等命令支持的参数也被精简,导致许多在正常Linux发行版下能正确运行的参数也无法执行的程度,很多正则表达式也不能识别;
2. Debian installer在系统安装时不同阶段,会按需加载需要的组件,如果在某阶段之前去执行,很多命令会因为组件还未加载完成无法执行,最典型的例子就是我在vnc里,过了partition分区阶段,手搓命令,可以挂载dd到硬盘后的Ubuntu系统文件,并写入cloud init,但如果在installer刚启动时就开始手搓命令,挂载命令就无法执行;
如果你愿意和我一样把键盘搓冒烟,通过Debian installer dd也能获得一个能正常运行的Ubuntu:



但是,一旦把以上案例中手搓的命令写入到Debian installer的自动应答文件preseed.cfg里,手搓效果和脚本执行效果就完全不同,Debian installer始终无法完成mount dd到硬盘中的Ubuntu镜像文件,并写入cloud init,这一步至关重要,如果无法完成,重启后的Ubuntu没有被进行过任何配置,包括ssh服务等都没有初始化,机器是无法连接的,整个安装过程,包括从服务器下载镜像,可以说是完全白费力气。
3. preseed.cfg本质上是一个规范Debian安装程序该如何自定义Debian系统安装的工具,并不能作为一个可以让命令在Debian installer里自由运行,配置的脚本,preseed中虽然可以通过指定 d-i partman/early_command string、d-i preseed/run string、d-i preseed/late_command string等方法让Debian installer去执行一些有限功能的命令,但这些方法执行命令时要么时机太靠前(刚刚开始时就运行),要么太靠后(装完Debian后再执行),相关命令和依赖也不能自由地加载和安装,所以除了将其用于dd Windows用,dd Ubuntu只能放弃。

虽然我老是抱怨AlpineLinux的各种缺点,并且它的环境也是busybox,但当它作为一个中介系统,除了不支持从纯ipv6启动,简直完美,煎饼哥眼光真是太独特了,找到这么一个系统作为中间件。当其在内存启动时,就是一个具备完整功能的Linux发行版,需要什么组件,就用apk add装什么,需要挂载分区还是格式化硬盘,使用对应的命令执行即可,丰俭由人,这点真的比Debian installer好太多了。
2#
发表于 2023-6-10 18:16:19 来自手机 | 只看该作者
大佬,你的脚本Dd吊鸡家的ipv6-only小鸡获取网络配置失败,装不上是什么原因?
3#
发表于 2023-6-10 18:21:35 | 只看该作者

  1. bash InstallNET.sh -d 12 -v 64 -a -p '@mjj123' -port '123'
复制代码

还是M佬一把梭整洁舒服
4#
 楼主| 发表于 2023-6-10 18:27:43 | 只看该作者
tufu001 发表于 2023-6-10 18:21
还是M佬一把梭整洁舒服

他的脚本对ipv6的支持为0,局限性太大了
5#
 楼主| 发表于 2023-6-10 18:30:30 | 只看该作者
C51 发表于 2023-6-10 18:16
大佬,你的脚本Dd吊鸡家的ipv6-only小鸡获取网络配置失败,装不上是什么原因? ...

看下私信,联系你了
6#
发表于 2023-6-10 18:54:12 | 只看该作者
本帖最后由 holinhot 于 2023-6-10 18:57 编辑

cloud init怎么会叫自动化安装呢?这东西不是在系统启动后提供个性化配置推送吗
ubuntu 22删掉了 pxe preseed自动装机支持?不太可能吧。没了preseed物理机怎么实现自动装机

你都有VNC或串口了直接netboot装就行
7#
 楼主| 发表于 2023-6-10 18:56:23 | 只看该作者
holinhot 发表于 2023-6-10 18:54
cloud init怎么会叫自动化安装呢?这东西不是在系统启动后提供个性化配置推送吗 ...

cloud init既可以给iso安装方式提供自动化部署,也可以给raw镜像覆写进去重启后的系统重启后提供初始化
8#
发表于 2023-6-10 19:08:15 | 只看该作者
本帖最后由 holinhot 于 2023-6-10 19:10 编辑
**璇玑 发表于 2023-6-10 18:56
cloud init既可以给iso安装方式提供自动化部署,也可以给raw镜像覆写进去重启后的系统重启后提供初始化 ...


难道我们用的不是一个cloud-init?
这东西是一个系统里的守护进程,用来推送个性化配置,例如云厂商的IP分配,SSH key,主机名。开机脚本等等。
我的说的自动装机是安装基本内核和驱动和GRUB;现在云厂商是构建自己构建一个镜像启动后用cloud-init推送个性化配置
https://cloud-images.ubuntu.com/focal/current/

用cloud-init这个守护进程可以向所有发行版本推送一致个性化配置,而不是需给不同发行版本维护特殊的执行脚本。
9#
 楼主| 发表于 2023-6-10 19:15:07 来自手机 | 只看该作者
holinhot 发表于 2023-6-10 19:08
难道我们用的不是一个cloud-init?
这东西是一个系统里的守护进程,用来推送个性化配置,例如云厂商的IP ...

对,我dd的镜像源就是从这里获得的,但你从iso启动安装不是得经历一系列步骤吗?不是全盘复写,这时候cloud init起到的作用就是全新布置,而不仅是推送个性设置
10#
发表于 2023-6-10 19:24:44 | 只看该作者
天权璇玑 发表于 2023-6-10 18:27
他的脚本对ipv6的支持为0,局限性太大了


大佬  有时间研究下 virtfusion 这种控制面板下面的小鸡怎么dd系统可以吗?
目前看来 你的dd脚本在 virtfusion控制面板下无效
附上磁盘错误图,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-4-26 06:28 , Processed in 0.062472 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表