kvm,UEFI,cloud image,cloud init

UEFI
前几天在云主机安装linux的时候,遇到一个问题,不能把bootload安装到mpr上。
原因不详,猜测是云平台做了校验。现在想来,可能是开启了UEFI的Secure Boot功能。

EFI是BIOS的替代,可以绕开MBR启动,还可以校验Boot Loader的哈希。目前很多OS都提供了EFI的支持,你有发现有个单独的EFI分区和目录,就是用于从EFI硬件启动的。

KVM也支持EFI。微软的Hyper V在创建虚拟机的时候,选择二代虚拟机就是使用EFI。Alpine Linux不支持EFI启动,只能创建一代虚拟机。现在的PC机估计都使用EFI启动了,比如荣耀的MagicBook,想从外置硬盘进去,选择EFI启动,就提示Bootloader的哈希校验失败。

看了Ubuntu的文档,为了支持UEFI 的Secure Boot,需要对Grub2的进行签名,并且公钥已经置于一个slim的标准启动程序里,这个由微软做了签名。。。。

Linux发行版的大小
为什么Alpine发行版可以做得很小,主要是用mulc库并进行了裁剪。

alphine的root fs可以只有十几兆,但是发行版却有50M之多,为什么呢?

原因是内核很大!这个发现很让我吃惊。但是为什么Openwrt的内核很小,可以装在路由器上呢?

其实alphine公共的内核很小,只有3M左右,还有100多M的内核模块,主要是驱动!

原来发行版要适应不同的机器,需要带上不同的驱动模块,所以才会很大。但是,Openwrt基本上是为硬件而定制的,不需要无关的模块,所以很小~

正因如此,如果为云主机而制作的发行版,是不是也可以去掉无关的驱动,从而变得很小呢~答案是肯定的,有专门为KVM等发行的Ubuntu等linux版本,所谓clound image就很小,只有100M左右。

除了裁剪无关的驱动,还裁剪无关的应用,所以现在Ubuntu镜像也可以做得很小。比如Ubuntu的Docker镜像就只有20M左右,所以完全没有必要使用alpine了。


Cloud init
除了裁剪驱动,clound image还可以免安装。因为从普通的iso进行安装,过程也是很繁琐的。

但是在云主机上,我们只要选个镜像,几秒钟就完成了安装,这是如何做到的?

原来这个Cloud Image都内置了Cloud-Init服务,这是一套标准的代码,在各个Linux版本的Cloud Image里都有。

这个Cloud Image已经去掉了安装过程,就是一个硬盘镜像,只要加载就能运行。
但是,如何修改镜像的主机名,以及登陆密码等等东西呢?cloud init是运行VM里的,如何向它注入信息呢?

这是通过用户提供的一个config.txt文件,填写了hostname,ssh-key以及password等需要定制的信息,所谓Userdata。然后,使用一个工具把这个user data写入一个新建的iso文件。

然后在创建VM的时候,同时加载Cloud Image和这个iso文件,实际就是两个硬盘,然后cloud-init脚本就能找到这些user data,完成系统的初始化工作了。

使用iso加载,以前我们在vmware安装增强工具的时候也遇到过,的确是一个往VM注入信息的好办法。

实际上,这个硬盘一直都在,每次启动都会加载。手动mount一下,发现里面有两个文件,一个 meta-data,一个user-data

~$ cat /mnt/meta-data
{instance-id: 9ccb4384-0cfa-11ea-89bd-00e04d99fe23}

~$ cat /mnt/user-data |head
#cloud-confighostname: cloud01
manage_etc_hosts: localhost
ssh_authorized_keys: [ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJctcHjw7Z6gFANCzkcfk9UjfQOM4Ggo3XKqv1dHoGc3V8F6KajGaUKJSOV8HvlxHoXejobbxNLBeOlIdwl



主机名也在这里,难怪在vm内部修改老是不成功,因为每次重启都被替换了。
要想改主机名,好像只能这么干

~# cat /etc/cloud/cloud.cfg
preserve_hostname: true


ubuntu甚至还提供了uvtool工具,可以很方便的下载最新镜像,创建VM等等。
有了cloud image,创建VM就很快了,而且镜像也很小。

原文时间:2019.11