热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

docker改host_利用hashicorppacker把dbcolinux导出为虚拟机和docker格式(2)

本文关键字:Cross-compile64-bitkernelon32-bitmachine在《将tinycolinux以硬盘模式安装到云主机》和《在tinycoli

本文关键字:Cross-compile 64-bit kernel on 32-bit machine

在《将tinycolinux以硬盘模式安装到云主机》和《在tinycolinux32上装tinycolinux64 kernel和toolchain》2篇文章中我们手动构建了32到64的tinycolinux的基础部分,而且用的是非cross compile,即直接在一台ubt64上产生这个kernel,再后来,针对文章1 —— 以硬盘方式安装iso到主机,我们利用虚拟机devops的构建工具packer自动构建了基本的tinycorelinux pe,现在我们继续文章2,利用devops packer自动构建直接从32位编译出64位的kernel。

这就需要用到cross compile。废话不说,直接上源码。这些源码可直接附在《基于虚拟机的devops套件及把dbcolinux导出为虚拟机和docker格式》文章所提到的源码的适当部分,然后以相同的方式构建,结果会产生一个可用的64 kernel+64 toolchain的dbcolinux:

新加的script1部分

注意这里的不同,root=/dev/hda1

#HD INSTALL
cd /mnt/hda1/
gunzip -c /mnt/hda1/boot/microcore.gz > /tmp/microcore.cpio
cpio -idmv echo menuentry "dbcolinux hd" { >> /mnt/hda1/boot/grub/grub.cfg
echo linux /boot/bzImage com1=9600,8n1 loglevel=3 user=tc console=ttyS0 console=tty0 noembed nomodeset root=/dev/hda1 tce=hda1 opt=hda1 home=hda1 restore=hda1 >> /mnt/hda1/boot/grub/grub.cfg
echo } >> /mnt/hda1/boot/grub/grub.cfg
rm /tmp/microcore.cpio

packer脚本部分

将这些放进provisioners中的适当部分。注意下面的_comments会引起错误,这里只是为了说明,使用时得去掉。

{"type": "shell","pause_before":"1s","_comment": “以下安装32位gcc443的官方tczs,因为grep,gcc_libs在scripts1中安装过了,所以这里不必另外安装,另外,scripts1生成的tmp得改一下权限才能在下一步上传文件”,"inline":["tce-load -iw gcc.tcz","tce-load -iw binutils.tcz","tce-load -iw bison.tcz","tce-load -iw diffutils.tcz","tce-load -iw file.tcz","tce-load -iw findutils.tcz","tce-load -iw flex.tcz","tce-load -iw gawk.tcz","tce-load -iw m4.tcz","tce-load -iw make.tcz","tce-load -iw patch.tcz","tce-load -iw pkg-config.tcz","tce-load -iw sed.tcz","tce-load -iw base-dev.tcz","tce-load -iw linux-headers-2.6.33.3-tinycore.tcz","tce-load -iw perl5.tcz","tce-load -iw ncurses.tcz","tce-load -iw ncurses-dev.tcz","sudo sh -c 'chown tc:staff /mnt/hda1/tmp/'"]},{"_comment": “这里开始上传编译所需的源码文件”,"type": "file","source": "pkgs/3.x/src/64kernelandtoolchain","destination": "/mnt/hda1/tmp"},{"_comment": “由于这里用了sudo,在scripts,2,3中所有命令默认都是经过了sudo的”,"type": "shell","pause_before":"1s","execute_command": "echo '' | sudo -S sh -c '{{ .Vars }} {{ .Path }}'","scripts":["./scripts/2.compile64toolchain.sh","./scripts/3.compile64kernel.sh"]}

compile64toolchain and compile 64 kernel

将这些放进scripts/2.compile64toolchain.sh文件中,不要轻易动这里的东西,否则格式不对产生的tls.h不能发现错误很诡异。

export PATH=$PATH:/usr/local/sbin:/usr/local/bin#我们现在是在32位上创建for 64的交叉,从64到32不叫交叉,反之要交叉
#三元组,machtype在在正常的linux32上会输出i686-pc-linux-gnu字样,tinycorelinux上是空。但是不产生问题
export BUILD=$MACHTYPE
export HOST=x86_64-pc-linux-gnu
export TARGET=x86_64-pc-linux-gnu#我们全程不必用sudo,因为packer文件中exe command写好了
cd /mnt/hda1/tmp/64kernelandtoolchain/
tar jxvf linux-2.6.33.3-patched.tar.bz2
tar zxvf binutils-2.20.tar.gz
tar zxvf glibc-2.12.1.tar.gz
tar zxvf mpfr-2.4.2.tar.gz
tar zxvf gmp-4.3.2.tar.gz
tar jxvf gcc-4.4.3.tar.bz2
mv gmp-4.3.2 gcc-4.4.3/gmp
mv mpfr-2.4.2 gcc-4.4.3/mpfrcd linux-2.6.33.3
make headers_install ARCH=x86_64 INSTALL_HDR_PATH=/mnt/hda1/usr/local/gcccross/$TARGETcd ../binutils-2.20 && mkdir b && cd b
../configure -prefix=/mnt/hda1/usr/local/gcccross -target=$TARGET -disable-multilib
make
make install#编译器执行文件
cd ../../gcc-4.4.3 && mkdir b && cd b
../configure -prefix=/mnt/hda1/usr/local/gcccross -target=$TARGET -enable-languages=c,c++ -disable-multilib
make all-gcc
make install-gccexport PATH=$PATH:/mnt/hda1/usr/local/gcccross/bin#标准C库头文件和一些必要启动文件
cd ../../glibc-2.12.1 && mkdir b && cd b
#在glibc眼里,这里的build和host一个意思,与标准的其它三元组意义不同
../configure -prefix=/mnt/hda1/usr/local/gcccross/$TARGET -build=$MACHTYPE -host=$HOST -target=$TARGET -with-headers=/mnt/hda1/usr/local/gcccross/$TARGET/include -disable-multilib libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes
make install-bootstrap-headers=yes install-headers
make csu/subdir_lib
install csu/crt1.o csu/crti.o csu/crtn.o /mnt/hda1/usr/local/gcccross/$TARGET/lib
#利用新编的64gcc处理
x86_64-pc-linux-gnu-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o /mnt/hda1/usr/local/gcccross/$TARGET/lib/libc.so
touch /mnt/hda1/usr/local/gcccross/$TARGET/include/gnu/stubs.h#编译器本身的库文件
cd ../../gcc-4.4.3/b/
make all-target-libgcc
make install-target-libgcc#标准C库
cd ../../glibc-2.12.1/b/
make
make install#标准C++库
cd ../../gcc-4.4.3/b/
make
make install

将这些放进scripts/3.compile64kernel.sh文件中

export PATH=$PATH:/mnt/hda1/usr/local/gcccross/bin#使用刚编译出来的gcccross,记得末尾的-
export ARCH=x86_64
export CROSS_COMPILE=x86_64-pc-linux-gnu-cd /mnt/hda1/tmp/64kernelandtoolchain/
# 这里奇怪之处:1,不作把/usr/local/ncurses*相关的库移到/usr/下会大量符号undefined,2,在guest os中测试时如果不用sudo,依然会提示无法找到ncurses相关库,3,sudo make clean没用,一定要sudo make mrproper。4,在virtual box play make menuconfig那行时会一直闪烁,在guestos中测试是正常的,5.所以我们用了make defconfig的方法,但这里还是保留menuconfig相关的脚本
cd linux-2.6.33.3
cp -R /tmp/tcloop/ncurses-dev/usr/local/include/*.* /usr/include/
cp -R /tmp/tcloop/ncurses-dev/usr/local/lib/lib*.a /usr/lib/
cp -R /tmp/tcloop/ncurses/usr/local/lib/*.* /usr/lib/
#直接放文件可能需要重启才能被引用生效,所以这里ldconfig一下
ldconfig
export TERMINFO=/usr/share/terminfo
export TERM=linux
make mrproper
cp -f ../config-2.6.33.3-tinycore64 arch/x86/configs/x86_64_defconfig
make x86_64_defconfig
make bzImagecp -f arch/x86/boot/bzImage /mnt/hda1/boot/bzImage64
echo menuentry "dbcolinux 64" { >> /mnt/hda1/boot/grub/grub.cfg
echo linux /boot/bzImage64 com1=9600,8n1 loglevel=3 user=tc console=ttyS0 console=tty0 noembed nomodeset root=/dev/hda1 tce=hda1 opt=hda1 home=hda1 restore=hda1 >> /mnt/hda1/boot/grub/grub.cfg
echo } >> /mnt/hda1/boot/grub/grub.cfgrm -rf /mnt/hda1/tmp/64kernelandtoolchain/#这是一条触发ask的错误语句,放在你猜想可能出现错误作为中断点的地方,但是它还会继续
Dsfasdfdf

好了,scripts3文件结束,产生的镜像文件可能很大。需要针对处理一下。

————

关注我

64049025294ba9648f9d9df92dc2cca8.gif
(此处不设回复和更新,点击GIF扫码到微信参与留言或获取资源)



推荐阅读
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • 现在比较流行使用静态网站生成器来搭建网站,博客产品着陆页微信转发页面等。但每次都需要对服务器进行配置,也是一个重复但繁琐的工作。使用DockerWeb,只需5分钟就能搭建一个基于D ... [详细]
  • systemd-nspawn可以创建最轻量级的容器(ns的意思就是namespace),本文的实验平台是Ubuntu16.04,x86_64机器。本文的目的是:在Ubuntu中用syst ... [详细]
  • Answer:Theterm“backslash”isonofthemostincorrectlyusedtermsincomputing.People ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了获取关联数组键的列表的方法,即使用Object.keys()函数。同时还提到了该方法在不同浏览器的支持情况,并附上了一个代码片段供读者参考。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • 本博文基于《Amalgamationofproteinsequence,structureandtextualinformationforimprovingprote ... [详细]
author-avatar
ENE的蓝白胖次
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有