一个fully retryable的rootbuild packer脚本,从0打造matecloudos(2):以lfs9观点看compiletc tools

本文介绍了一种构建临时系统的详细步骤与注意事项,重点讨论了GCC编译过程中的问题解决方法,包括如何确保编译过程可重试、避免异常运行情况等。

本文关键字,bash 命令替换嵌套,bash echo -e输出换行,lfs Constructing a Temporary System,How to uninstall gcc installed from source

在《一种虚拟boot作通用bootloader及一种通用qemu os的设想》和《一个fully retryable的rootbuild packer脚本,从0打造matecloudos(1):》中,我们都讲到tc11上编译/交叉编译gcc920的实践,其中前者是我基于clover build gcc8修改而来的,这套脚本有很多增强和亮点,如downloadandextracttarballs()脚本与大文件分开,源码包在外部下载,,“all slient compiling”和“判断连续命令最后一条是否出错”的方法。。,后者则是我针对tc官方的compiletc11,结合这些亮点和增强,打造的最终“力求fully retryable”的packer脚本(我们选择了tclinux这类有"动态mountable,包管理重启后没有污染",“包被放在硬盘上也不占内存”,“系统与数据分离”优点的云系统来作为m同样是mate"cloud"os的基础,用packer脚本来一步步构建它)。而其实,我们之前很多文章如《把dbcolinux导出为虚拟机和docker格式》《将虚拟机集成在bios中:avatt》,也是这类实践的例子。

说到这个cross compile in packer,为什么要花大力气去编译toolchain且做成packer? 因为我们要力求把这个过程做成可观察参考的动态例子(packer中一切都是从0开始provisione起来的),搜索引擎搜索到的那些,都是基于传统的方法(如https://wiki.osdev.org/GCC_Cross-Compilerc能查到的那些(《一种虚拟boot…qemu os的设想》和《dbcolinux》《avatt》也属于这种方法),而lfs9(http://www.linuxfromscratch.org/lfs/downloads/9.0/LFS-BOOK-9.0.pdf)是业界的标准实践路子(《一个fully retryable的rootbuild packer脚本》和compiletc11就是属于lfs9的路子),其实编译gcc也不是什么特别复杂的工作,只是这里面的问题是从来找不到一个必然会成功的例子中间有很多坑你只能去实践:

1,toolchain是属于基础工具,基于“先用起来主义”随着历史发展起来的gcc很复杂,有很多配置和参数(整个gcc也没有retryable的make uninstall的支持,只有部分有),版本之间又有差别,binutils这种东西又是独立gcc的,虽然有lfs这种标准教程和很多crossbuild工具/buildroot工具套件,但是除非你像lfs一样一步一步照做,否则离构建成功,该踩的坑你还是要踩(实际上照lfs做你照样会踩坑)。
2,如果你选择手动,除去上面提到的过程中出现的坑,结果也会出现一些,如果你不注意,有时会碰到虽然toolchain构建成功了,但是异常运行的情况(实际效果不是我们要的)。而lfs和buildroot这种套件又没有针对构建中每一个pass,pass中的subpass的中间调试信息。保证每一步结果都是正确的到最后必然正确的设施。compiletc11的脚本中有一些。
3,…
4,这一切都导致了能编译一套toolchain也其实是工作量不小的事情,也是我们这个《一个fully retryable的rootbuild packer脚本》系列要解决的问题。

不废话了。上脚本:

重新改的ezremasterd iso和packer provisioner部分

这个脚本主要是清晰化了做进iso和写进packer文件的界限。被注释的都是做进了ezremasterd iso的,当然,具体方法跟被注释的语句不是一一对应的,但是效果相当。你可以将一切都保留在packer脚本中,去掉注释稍微修改即可,这样可以免ezremaster一次iso,我这样做只是为“最终服务于显式构建tc11主要逻辑,不让packer变得过乱”。

"provisioners": [
	{
    	"type": "shell",
    	"pause_before":"1s",
    	"inline":[
		"export PATH=$PATH:/usr/local/sbin:/usr/local/bin",

		"echo 'PREPARE HD'",
		"sudo parted -s /dev/sda mktable msdos",
		"sudo parted -s /dev/sda mkpart primary ext3 2048s 100%",
		"sudo parted -s /dev/sda set 1 boot on",
		"sudo mkfs.ext3 /dev/sda1",
		"sudo rebuildfstab",
		"sudo mount /dev/sda1",

	  	"echo 'make iso perisit for after reboot useablity(commented statements were remasterd into iso already)'",
		"sudo grub-install --boot-directory=/mnt/sda1/boot /dev/sda",
	  	"sudo cp /mnt/sr0/boot/corepure64.gz /mnt/sda1/boot/corepure64.gz",
	  	"sudo cp /mnt/sr0/boot/vmlinuz64 /mnt/sda1/boot/vmlinuz64",
	  	"sudo sh -c 'echo set timeout=3 > /mnt/sda1/boot/grub/grub.cfg'",
	  	"sudo sh -c 'echo menuentry \"tclinuxforselfbootstrape for after reboot useablity\" { >> /mnt/sda1/boot/grub/grub.cfg'",
	  	"#append bootcodes: loglevel=3 tce=sda1 opt=sda1 home=sda1 restore=sda1 cde",
	  	"sudo sh -c 'echo linux /boot/vmlinuz64 loglevel=3 tce=sda1 opt=sda1 home=sda1 restore=sda1 cde >> /mnt/sda1/boot/grub/grub.cfg'",
	  	"sudo sh -c 'echo initrd /boot/corepure64.gz >> /mnt/sda1/boot/grub/grub.cfg'",
	  	"sudo sh -c 'echo } >> /mnt/sda1/boot/grub/grub.cfg'",

	  	"echo 'ADD PKG(commented statements were remasterd into iso already)'",
		"sudo mkdir -p /mnt/sda1/opt /mnt/sda1/home /mnt/sda1/tce",
		"sudo tce-setup",
		"sudo rm /opt/tcemirror && sudo touch /opt/tcemirror",
		"sudo sh -c 'echo http://10.211.55.2:8000/tinycorelinux/ > /opt/tcemirror'",
		"sudo sh -c 'sed -i s/wget[[:space:]]*-c[[:space:]]/\"wget -cq \"/g /usr/bin/tce-load'",
		"#tce-load -iw -s openssh parted grub-multi",
		"tce-load -iw -s bash",

		"echo 'add neccessy and fix the small system issues(commented statements were remasterd into iso already)'",
		"sudo rm -rf /usr/bin/ar",
	  	"#sudo passwd tc",
	  	"#tc",
	  	"#tc",
		"#sudo cp /usr/local/etc/ssh/sshd_config.ori /usr/local/etc/ssh/sshd_config",
		"#sudo mkdir -p /var/lib/sshd/",
		"#sudo mkdir -p /usr/local/etc/ssl/certs/",
	  	"#sudo /usr/local/etc/init.d/openssh start",

	  	"echo 'PRE SAVE STATE(commented statements were remasterd into iso already)'",
	  	"sudo sh -c 'echo opt/tcemirror >> /mnt/sda1/opt/.filetool.lst'",
	  	"#sudo sh -c 'echo usr/local/etc/ssh > /mnt/sda1/opt/.filetool.lst'",
	  	"#sudo sh -c 'echo etc/passwd &g
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值