神刀安全网

RancherOS iPXE 启动以及ISO重新打包的方法

VER: 1

RancherOS iPXE 启动以及ISO重新打包的方法

意义

最近一直在尝试自己写一服务器平台方便自己和别人开发的,能把流程做进去最好了。 但是万事开头难,在尝试了CoreOS iPXE 启动方法之后发现Image太大大概要200mb+的样子。 Boot2Docker始终没找到正确的看文档的方式,这种方法我个人预估也只能是Docker ToolBox使用比较靠谱了。 然后开始尝试RancherOS的IPXE启动操作系统但是但是很不稳定,有的时候Cloud-init下载不了。 大概2次就有一次无法启动不能忍,但是不用cloud-init还好,但是也是去了在我这里使用的意义。 这种只适合大规模的集群部署。不得不说他们的工作真的很赞。

那么要满足我的需求:

  1. Image 要小
  2. 开机迅速,可定制。各种系统配置。
  3. 稳定不容易出错。
  4. 自动持久化。
  5. 可以持续集成打包。

那么就只有一个路线syslinux使用 mkisofs 这个工具重新打包RancherOS最后我自己打包的结果30mb 比官方的还小1mb还可以对docker 进行自动持久化。方便在不同系统种分发Docker daemon

iPXE 启动的方法:

VirtualBox参考启动:

VBoxManage createvm --name "service" --register VBoxManage modifyvm "service" --memory 512 --acpi on --boot1 dvd VBoxManage modifyvm "service" --nic1 hostonly --hostonlyadapter1 vboxnet0 --nicpromisc1 allow-all VBoxManage modifyvm "service" --nic2 nat  --natnet2 "192.168/16" --natpf2 "guestssh,tcp,,2222,,22" --nicpromisc2 allow-all VBoxManage modifyvm "service" --ostype Linux  VBoxManage createhd --filename /mnt/vdis/io.vdi --size 10000 VBoxManage storagectl "service" --name "IDE Controller" --add ide VBoxManage storageattach "service" --storagectl "IDE Controller"  /     --port 0 --device 0 --type hdd --medium /mnt/vdis/io.vdi VBoxManage storageattach "service" --storagectl "IDE Controller" /     --port 1 --device 0 --type dvddrive --medium /mnt/git/ipxe/src/bin/ipxe.iso 

因为总是需要重新启动调试所以这里把所有的VBOX操作都自动化。提升调试速度。

ipxe.iso 重新打包

因为要针对我们的using case使用,我们需要自动化boot一个固定的操作系统 所以这里要针对我们的脚本重新打包。

iso重新打包命令如下

git clone git://git.ipxe.org/ipxe.git cd ipxe/src make bin/ipxe.iso EMBED=bootscript 

打包依赖:

gcc (version 3 or later) binutils (version 2.18 or later) make perl syslinux (for isolinux, only needed for building .iso images) liblzma or xz header files 

bootscript 的内容:

#!ipxe  dhcp chain http://192.168.56.1:8089/boot.html 

注意: boot的时候请求的整个地址返回的内容为启动脚本。

启动脚本内容:

#!ipxe # Boot a persistent RancherOS to RAM  # Location of Kernel/Initrd images set base-url http://192.168.56.1:8089  kernel ${base-url}/vmlinuz044 rancher.state.formatzero=true rancher.state.autoformat=[/dev/sda] rancher.cloud_init.datasources=['url:http://192.168.56.1:8089/rancheros.yml'] initrd ${base-url}/initrd044 boot 

然后就可以启动RancherOS了。

启动流程说明: 虚拟机启动->启动ipxe DVD->Chain load 请求 boot.html -> iPXE 根据boot.html下载 vmlinuz initrd -> 带入参数启动Linux(其实PE之类的也都好使)

参考文档:

重新打包RancherOS 系统image

虽然官方提供了 Release下载 但是这里面的iso对于我的使用场景来说还远远不够。 首先默认密码不能是固定的rancher,另外Docker 自动持久化的部分并没有做,另外就是Docker启动参数我不想用默认的我需要有一定的调整。这些原因通过iPXE.iso重新打包的方法学习之后促成了这一想法虽然简单,但是kernel参数的调整的确花费了我至少2-3小时的时间。为了避免自己再次踩坑来写一些说明。

VBOX 调试脚本

VBoxManage createvm --name "service" --register VBoxManage modifyvm "service" --memory 512 --acpi on --boot1 dvd VBoxManage modifyvm "service" --nic1 hostonly --hostonlyadapter1 vboxnet0 --nicpromisc1 allow-all VBoxManage modifyvm "service" --nic2 nat  --natnet2 "192.168/16" --natpf2 "guestssh,tcp,,2222,,22" --nicpromisc2 allow-all VBoxManage modifyvm "service" --ostype Linux  VBoxManage createhd --filename /mnt/vdis/io.vdi --size 10000 VBoxManage storagectl "service" --name "IDE Controller" --add ide VBoxManage storageattach "service" --storagectl "IDE Controller"  /     --port 0 --device 0 --type hdd --medium /mnt/vdis/io.vdi VBoxManage storageattach "service" --storagectl "IDE Controller" /     --port 1 --device 0 --type dvddrive --medium /mnt/git/rancheros.iso 

打包命令(build.sh):

mkisofs -o ros.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table rosiso/ 

打包后结果

├── build.sh ├── rosiso │   ├── initrd │   ├── isolinux │   │   └── isolinux.bin │   ├── isolinux.cfg │   └── vmlinuz └── ros.iso 

文件来源:

  • initrd 以及vmlinuz 从rancheros release 页面获取
  • isolinux.bin 如果是ubuntu文件的位置在: /usr/lib/syslinux/isolinux.bin
  • boot.cat 是自动生成的
  • ros.iso 生成的系统镜像

isolinux.cfg 启动参数定制

default rancheros label rancheros     kernel /vmlinuz     initrd /initrd     append quiet rancher.password=rancher rancher.state.autoformat=[/dev/sda] rancher.state.formatzero=true  

参数解释:(从quiet之后开始)

  • rancher.password 设置默认账户密码。
  • rancher.state.autoformat 自动格式化磁盘。
  • Starts with 1 megabyte of zeros and rancher.state.formatzero is true.
  • 参数顺序会影响系统稳定性。
  • 所有参数查看需要等启动之后sudo ros c export -f > cfg.yml 几乎所有参数都可以调整,另外单独一个参数里面不能有空格kernel的参数检查比cloud-init模块本身严格多了。
  • 上面这种方式为cmdline 操作系统源码 在GetDatasources 函数这里。

参考文档:

Windows 启动参考

"C:/Program Files/Oracle/VirtualBox/VBoxManage.exe" createvm --name "service" --register "C:/Program Files/Oracle/VirtualBox/VBoxManage.exe" modifyvm "service" --memory 512 --acpi on --boot1 dvd "C:/Program Files/Oracle/VirtualBox/VBoxManage.exe" modifyvm "service" --nic1 hostonly --hostonlyadapter1 "VirtualBox Host-Only Ethernet Adapter" --nicpromisc1 allow-all "C:/Program Files/Oracle/VirtualBox/VBoxManage.exe" modifyvm "service" --nic2 nat  --natnet2 "192.168/16" --natpf2 "guestssh,tcp,,2222,,22" --nicpromisc2 allow-all "C:/Program Files/Oracle/VirtualBox/VBoxManage.exe" modifyvm "service" --ostype Linux  "C:/Program Files/Oracle/VirtualBox/VBoxManage.exe" createhd --filename D:/io.vdi --size 10000 "C:/Program Files/Oracle/VirtualBox/VBoxManage.exe" storagectl "service" --name "IDE Controller" --add ide "C:/Program Files/Oracle/VirtualBox/VBoxManage.exe" storageattach "service" --storagectl "IDE Controller"  --port 0 --device 0 --type hdd --medium D:/io.vdi "C:/Program Files/Oracle/VirtualBox/VBoxManage.exe" storageattach "service" --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium D:/ros.iso 

注意: hostonly 网卡名字

vboxmanage 踩坑

查看所有hostonly网卡:

VBoxManage list hostonlyifs

创建网卡并配置DHCP

VBoxManage hostonlyif create VBoxManage hostonlyif ipconfig vboxnet0 --ip 192.168.56.1 VBoxManage dhcpserver add --ifname vboxnet0 --ip 192.168.56.1 --netmask 255.255.255.0 --lowerip 192.168.56.254 --upperip 192.168.56.200 VBoxManage dhcpserver modify --ifname vboxnet0 --enable 

注意上面如果是windows注意换网卡名字

总结

  • 新打包好的系统大小30MB
  • 启动时间10s左右(机械硬盘)
  • 强制关机,重新启动10次以上无错误。每次测试都有不同的小操作。

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » RancherOS iPXE 启动以及ISO重新打包的方法

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址