千家信息网

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

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,本篇内容主要讲解"如何在tinycolinux上组建子目录引导和混合32位64位的rootfs系统",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何在ti
千家信息网最后更新 2025年02月02日如何在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 0sysfs /system/sys sysfs defauts 0 0

inittab:

::sysinit:/system/etc/init.d/rcSconsole::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系统"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

系统 文件 测试 程序 脚本 链接 编译 混合 准备 提示 运行 子目 子目录 不断 内容 参数 就是 环境 成功 下有 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 直连服务器连接局域网 软件开发标准化步骤 为啥服务器租用 海天小说软件开发 武汉征原电气软件开发 杭州富阳区app软件开发 个人能使用万方数据库吗 组态王的历史数据库怎么打开 学软件开发用游戏本可以吗 内部控制白皮书数据库 台州自由基网络技术有限公司 梦幻西游四海升平服务器散人多吗 新建数据库排序规则怎么选 网络安全管理转正自我鉴定 服务器连接不上啥子原因 个人简历模板范文软件开发 sql服务器角色是什么 亿信华辰数据库怎么样 城管通软件开发专业制作 上海仁新网络技术 葛之杨 互信互通服务器管理端口 信息管理技术发展数据库技术 服务器显示器怎么用 谷歌服务器 在哪 管家婆如何在服务器上删数据 ios手机软件开发方案 东莞海鲜冷库软件开发 湛江开发区斗虎网络技术工作室 手机可以改网络服务器地址吗 数据库关系连接的概念和公式
0