基于web技术的操作系统安装器的设计

什么是基于web技术的安装器(web-based installer)?

传统的Linux操作系统安装需要启动一个LiveOS,然后在LiveOS中运行一个本地安装程序,如Fedora下的Anaconda. LiveOS除了让用户在安装操作系统之前能预先体验之外,也为安装器提供了运行环境。这对于桌面操作系统已然足够,因为PC、笔记本电脑自带终端设备——键盘、显示器、鼠标。然而,如果要给一台服务器安装操作系统则稍微复杂了一点,因为服务器通常没有这些终端设备。这就需要利用网络和VNC将服务器端的图像传送出来。这样做的缺点在于,网络负载很大,在网络条件不好的环境下会带给用户非常差的安装体验。另外,本地安装器也会依赖很多的图形软件包,不仅会增加ISO的大小,也会带来很多版权及法律上的工作量。

基于web技术的安装器则利用web开发技术——HTML5,Javascript,CSS,web server等,让用户可以通过浏览器直接安装操作系统。目前,”KVM for IBM z Systems”已经采用这种安装方式。

基于web技术安装器的优势

  • 依赖更少的软件包
  • 非常小的网络负载,网页加载后只需要通过Ajax来与服务器通信
  • 可通过浏览器跨平台访问
  • 对于服务器及集群安装非常方便
  • 易于与其他软件集成,提供RESTful API
  • 满足可访问性,方便残障人士使用

使用web安装器的安装流程

使用web安装器来安装操作系统的流程非常简单,只需要如下几个步骤:

  1. 加载ISO
  2. 用https://{IP_OF_SERVER}作为URL来访问安装器
  3. 按照安装器的引导完成安装
  4. 点击安装器的重启按钮重启服务器,安装完成

Web安装器实现的功能

  • 国际化及多语言支持,选择安装语言与系统语言
  • 版权声明
  • 磁盘列表及选择安装磁盘
  • 添加SCSI磁盘
  • 添加DASD磁盘
  • Swap分区加密
  • 自动分区
  • 手动分区
  • 分区操作列表
  • 激活网卡
  • IPv4配置
  • IPv6配置
  • 主机名及搜索域配置
  • NTP配置
  • Kdump配置
  • 时区设置
  • Root密码设置
  • 添加、删除用户
  • 配置总结列表
  • 无人值守安装
  • 安装日志下载

Web安装器的架构设计

Web安装器分为前端和后端两部分实现:前端负责UI展示及用户交互,后端负责给前端提供RESTful API并根据前端的API调用来存储用户配置数据,执行分区、安装、配置目标系统等操作。

Web安装器由4个HTML页面组成:

  • 欢迎页:介绍操作系统,提供选择安装语言的下拉框,点击下一步可进入到版权声明页
  • 版权声明页:显示版权文件,在用户同意后可跳转到配置页面
  • 配置页:引导用户进行系统配置
  • 安装页:展示安装进度,安装完成后可点击重启按钮重启系统

UI是基于HTML5、CSS3及Javascript等网页开发技术,并利用如下工具:

  • jQuery:一个快速、小巧且功能丰富的js库,可用来操作DOM,处理事件及Ajax请求
  • Bootstrap:最流行的前端开发框架之一,多用于开发响应式、移动优先的web项目
  • Bootstrap-select: jQuery 插件,利用Bootstrap,但提供了功能更加丰富的下拉选择框控件
  • Jquery Validation :jQuery插件,用来检验表单的合法性

后端由以下几个模块组成:

  • CherryPy:一个轻量级的python web发布器
  • Model:存储用户的配置数据
  • RESTful API:为前端提供API接口
  • 子功能模块:提供安装器的各个子功能

为虚拟机vCPU绑定物理CPU

为了提高缓存命中率,提高虚拟机性能,可以将vCPU绑定到指定的物理CPU去执行。具体设置步骤如下:

  1. 在宿主机操作系统启动时将用于虚拟机的CPU独立出来,使其上只运行vCPU线程,QEMU进程和少数的管理进程。设置方法即是在内核启动参数中加入: isolcpus=0,1 例如在grub.cfg下面的配置如下:
        menuentry 'Fedora (3.13.6-200.fc20.x86_64) 20 (Heisenbug)' --class fedora --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.4-200.fc20.x86_64-advanced-5bcef32f-430b-4d74-beaa-4fcfccc438f9' {
                ......
        	linux	/vmlinuz-3.13.6-200.fc20.x86_64 root=UUID=5bcef32f-430b-4d74-beaa-4fcfccc438f9 ro vconsole.font=latarcyrheb-sun16  rhgb quiet LANG=zh_CN.UTF-8 isolcpus=0,1
        	initrd /initramfs-3.13.6-200.fc20.x86_64.img
        }
  1. 使用taskset命令将vCPU线程绑定到指定的物理CPU。例如,某虚拟机的qemu进程及两个vCPU线程如下:
        ​[root@kelvin ~]# ps -eLo ruser,pid,ppid,lwp,psr,args | grep qemu | grep -v grep
        root      4706  3629  4706   1 qemu-system-x86_64 -m 2G -smp 2 /var/lib/libvirt/images/fedora.img -enable-kvm
        root      4706  3629  4708   1 qemu-system-x86_64 -m 2G -smp 2 /var/lib/libvirt/images/fedora.img -enable-kvm
        root      4706  3629  4709   0 qemu-system-x86_64 -m 2G -smp 2 /var/lib/libvirt/images/fedora.img -enable-kvm

若要将线程ID为4709的vCPU从CPU0绑定到CPU2上执行,可使用如下命令: #taskset -p 0x4 4709 -p后面接的是物理CPU的掩码,其二进制表示从最低位到最高位分别表示第0个物理CPU到最后一个物理CPU,若二进制表示为1,则表示某线程可以在该物理CPU上运行,若为0,则不能。上面的命令的含义就是,线程ID为4709的线程(vCPU)只能在第2个(从0开始编号)物理CPU上运行。执行上述命令的结果如下:

        [root@kelvin ~]# taskset -p 0x4 4709
        pid 4709's current affinity mask: f
        pid 4709's new affinity mask: 4
        [root@kelvin ~]# ps -eLo ruser,pid,ppid,lwp,psr,args | grep qemu | grep -v grep
        root      4706  3629  4706   3 qemu-system-x86_64 -m 2G -smp 2 /var/lib/libvirt/images/fedora.img -enable-kvm
        root      4706  3629  4708   0 qemu-system-x86_64 -m 2G -smp 2 /var/lib/libvirt/images/fedora.img -enable-kvm
        root      4706  3629  4709   2 qemu-system-x86_64 -m 2G -smp 2 /var/lib/libvirt/images/fedora.img -enable-kvm

线程ID为4709的vCPU已经在编号为2的物理CPU上运行了。