如何在tinycolinux上组建子目录引导和混合32位64位的rootfs系统

本篇内容主要讲解“如何在tinycolinux上组建子目录引导和混合32位64位的rootfs系统”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何在tinycolinux上组建子目录引导和混合32位64位的rootfs系统”吧!

公司主营业务:做网站、成都网站建设、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出利州免费做网站回馈大家。

在tinycolinux上组建32/64位混合文件系统

在《在tinycolinux32上装64位toolchain》文中,我们提到产生的64位程序不能运行,甚至ldd都不能分析出其引用,仅提示wrong elf64class,直接执行也提示not found,这是因为它找不到64位共享库,由于ldd无法使用,我们通过其它手段分析,发现最终原因其实是因为默认64位GCC产生的glibc,将GCC产生的程序对loader,即ld-linux-x86-64.so的引用,放在了/lib64中(至于其它基础库libc-2.12.1.so,libcrypt-2.12.1.so,libm-2.12.1.so,libpthread-2.12.1.so,你可以把它做起对应软链一同放在/lib64中,其实不做也可以,因为它们被引用在了/usr/local/gcc443/x86_64-pc-linux-gnu/lib这个是由编译工具链时hardcoded指定的,还有libstdc++.so.6.13,libgcc_s.so.1也要放/usr/local/gcc443/x86_64-pc-linux-gnu/lib)。因此我们仅需:

首先把这个文件和它引用的真实文件ld-2.12.1.so复制到/lib64下,并把ld-2.12.1.so加起执行权限来(这个至关重要,否则会提示access corrupt shared libraries),然后把上述的文件各自复制到其所在目录。执行64位测试程序,发现能成功运行!

这样,tinycolinux就拥有了二套GCC支持开发和运行的程序,所在的文件系统,一套在/lib下,一套在/lib64下。分别同时支持32位和64位。

在tinycolinux上组建system和usr extend分开的高定文件系统

还记得我们开头谈到至简的rootfs就是busybox+一些init脚本吗,我们不断提到的busybox是一个产生rootfs的基础和中心,总管,它自包含我们建立这个测试环境需要的一切,我们来使用它建立这个最简的rootfs样本:

我们是在tinycolinux本身带有GCC481的环境下测试的,为了方便测试使用云主机,使用快照随时准备备份恢复重来,使用的tinycolinux它自己就有rootfs。根目录下有个init,/bin下有个busybox,注意到这些细节后,我们来构建自己的busybox:

首先下载busybox源码http://mirrors.163.com/tinycorelinux/3.x/release/src/下载busybox-1.19.0.tar.bz2,busybox-1.19.0-config和9个patch并运用到解包后的源文件,按《tinycolinux上硬盘安装》一文准备sudo make menuconfig并运用config,为了我们的分离式文件夹系统,busybox事先是被静态链接的,静态链接可以免去对lib目录的依赖,且编译menuconfig配置时设置了把/system/usr/bin,/system/usr/sbin一起合并到/system/bin,system/sbin中, --- 因为lib我们要将其做在usr文件夹中,与system,boot并列,sudo make install 编译好后复制_install为根目录下的/system,那个/system/linuxrc不要删。

然后我们按照《将tinycolinux安装在硬盘上》一文中的grub启动/boot下的kernel,具体我们测试用的kernel启动参数是:linux /boot/bzImage ro root=/dev/vda1 swapfile=vda1 local=vda3 home=vda3 opt=vda3 tce=vda3 init=/system/init,,,完整的grub菜单文本请参照那文查看。注意到init=/system/linuxrc,这是新加的一条参数。它定义了系统在引导系统时发现root=/dev/vda1后,完成系统将执行权交给PID0来初始化文件系统的那个PID0,root只能是设备,对应文件系统中的/,而init pid0可以是/下任意路径下的一个可执行程序,一段脚本。这段参数其实就是kernel转手给通往rootfs init的连接器(其实你可以patch kernel中的init/main.c让它加载你自己的init)。

业界有很多复杂化的init,如systemvinit等,tinycolinux也定义了它的脚本化init,在tinycolinux中,init是根下的init是一段脚本,但对于简单的init,你可以将它直接链接到busybox中的init,在我们的测试环境,就是这么用的:linuxrc链接到system/bin/init,busybox init仅链接就能作为init使用是因为它其实包含了一系列默认动作,就像传统init能做的那样:它首先会查找etc/inittab,这个文件可以没有,没有的话,busybox init会执行/etc/init.d/rcS,在这里它要执行一些必要工作,所以我们还要准备一些把busybox当init用脚本和作一些初步工作:a)在/system下建立dev,etc,proc,sys四个空目录,b)dev下准备二个设备文件 mknod console c 5 1和mknod null c 1 3,然后: c)etc下提供fstab,inittab,init.d/rcS,其中inittab,rcS都加起执行权限,内容分别为:

fstab:

proc /system/proc proc defaults 0 0
sysfs /system/sys sysfs defauts 0 0

inittab:

::sysinit:/system/etc/init.d/rcS
console::respawn:-/system/bin/sh
::ctrlaltdel:/system/sbin/reboot
::shutdown:/system/bin/umount -a -r

init.d/rcS:

#!/system/bin/sh
/system/bin/mount -a

好了,仅是这样就OK了(你可以先不用/system,将上面的rootfs打包成initrd.gz在普通方式下测试,证明这个文件系统是完善的,最终结果是进入无误进入命令行。)。下面我们试着让基于附加了/system的rootfs运行,直接改名原来tinycolinux的/bin/busybox,让新的busybox生效,继续如下测试,如果失败有下列原因之一,在下列失败可能和解决方案循环间不断恢复云主机重新尝试:

1)失败可能:

提示kernel panic,说提供的init不可执行,系统尝试执行tinycolinux /下的默认init

warning:cant start default console

sbin/gettty not found之类之类

可以看到sh,但ls ,which not found

可见光是脚本文件不足于影响busybox的行为,由于我们企图将etc这些东西归类到/system/etc下,所以我们需要定制busybox中的路径硬编码部分以继续测试:

2)解决方案:

改动源码:

include/libbb.h

1690: define bb_default_path      (bb_PATH_root_path + sizeof("PATH=/system/bin:/system/sbin:/sbin:/usr/sbin"))
1717: #define LIBBB_DEFAULT_LOGIN_SHELL  "-/system/bin/sh"
1725: #define CURRENT_TTY "/system/dev/tty"
1726: #define DEV_CONSOLE "/system/dev/console"

init/init.c

137: #define INIT_SCRIPT  "/system/etc/init.d/rcS"   //为全程定制busybox 
init的行为起见,这句必须要搭配下面一句inittab使用
638: parser_t *parser = config_open2("/system/etc/inittab", fopen_for_read);
684: tty = concat_path_file("/system/dev/", skip_dev_pfx(tty));
996: putenv((char *) "SHELL=/system/bin/sh");
1018: new_init_action(SYSINIT, "mount -t proc proc /system/proc", "");

继续编译。

cd /tce/busybox sudo make clean sudo make install sudo cp _install/system/bin/busybox /system/bin

不断测试,最终成功。系统启动过程无误,最终出现正常命令行。当然还有很多需改动使这个rootfs变得更完善的空间。


为了维护这套干净强大的文件系统设计,用户要注意在编译程序时将其产生到/usr下,永远不要采用./configure 默认无prefix的情况。

你可以整合tinycolinux的现有init逻辑,把tinyclinux的根文件系统改造成高定文件系统,以如上在tinycolinux内部循序渐进地改动进行的方式。

到此,相信大家对“如何在tinycolinux上组建子目录引导和混合32位64位的rootfs系统”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


当前文章:如何在tinycolinux上组建子目录引导和混合32位64位的rootfs系统
文章网址:http://myzitong.com/article/jhgjoo.html