溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在tinycolinux上組建子目錄引導(dǎo)和混合32位64位的rootfs系統(tǒng)

發(fā)布時(shí)間:2021-11-30 09:21:37 來源:億速云 閱讀:138 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“如何在tinycolinux上組建子目錄引導(dǎo)和混合32位64位的rootfs系統(tǒng)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何在tinycolinux上組建子目錄引導(dǎo)和混合32位64位的rootfs系統(tǒng)”吧!

在tinycolinux上組建32/64位混合文件系統(tǒng)

在《在tinycolinux32上裝64位toolchain》文中,我們提到產(chǎn)生的64位程序不能運(yùn)行,甚至ldd都不能分析出其引用,僅提示wrong elf64class,直接執(zhí)行也提示not found,這是因?yàn)樗也坏?4位共享庫,由于ldd無法使用,我們通過其它手段分析,發(fā)現(xiàn)最終原因其實(shí)是因?yàn)槟J(rèn)64位GCC產(chǎn)生的glibc,將GCC產(chǎn)生的程序?qū)oader,即ld-linux-x86-64.so的引用,放在了/lib64中(至于其它基礎(chǔ)庫libc-2.12.1.so,libcrypt-2.12.1.so,libm-2.12.1.so,libpthread-2.12.1.so,你可以把它做起對(duì)應(yīng)軟鏈一同放在/lib64中,其實(shí)不做也可以,因?yàn)樗鼈儽灰迷诹?usr/local/gcc443/x86_64-pc-linux-gnu/lib這個(gè)是由編譯工具鏈時(shí)hardcoded指定的,還有l(wèi)ibstdc++.so.6.13,libgcc_s.so.1也要放/usr/local/gcc443/x86_64-pc-linux-gnu/lib)。因此我們僅需:

首先把這個(gè)文件和它引用的真實(shí)文件ld-2.12.1.so復(fù)制到/lib64下,并把ld-2.12.1.so加起執(zhí)行權(quán)限來(這個(gè)至關(guān)重要,否則會(huì)提示access corrupt shared libraries),然后把上述的文件各自復(fù)制到其所在目錄。執(zhí)行64位測(cè)試程序,發(fā)現(xiàn)能成功運(yùn)行!

這樣,tinycolinux就擁有了二套GCC支持開發(fā)和運(yùn)行的程序,所在的文件系統(tǒng),一套在/lib下,一套在/lib64下。分別同時(shí)支持32位和64位。

在tinycolinux上組建system和usr extend分開的高定文件系統(tǒng)

還記得我們開頭談到至簡的rootfs就是busybox+一些init腳本嗎,我們不斷提到的busybox是一個(gè)產(chǎn)生rootfs的基礎(chǔ)和中心,總管,它自包含我們建立這個(gè)測(cè)試環(huán)境需要的一切,我們來使用它建立這個(gè)最簡的rootfs樣本:

我們是在tinycolinux本身帶有GCC481的環(huán)境下測(cè)試的,為了方便測(cè)試使用云主機(jī),使用快照隨時(shí)準(zhǔn)備備份恢復(fù)重來,使用的tinycolinux它自己就有rootfs。根目錄下有個(gè)init,/bin下有個(gè)busybox,注意到這些細(xì)節(jié)后,我們來構(gòu)建自己的busybox:

首先下載busybox源碼http://mirrors.163.com/tinycorelinux/3.x/release/src/下載busybox-1.19.0.tar.bz2,busybox-1.19.0-config和9個(gè)patch并運(yùn)用到解包后的源文件,按《tinycolinux上硬盤安裝》一文準(zhǔn)備sudo make menuconfig并運(yùn)用config,為了我們的分離式文件夾系統(tǒng),busybox事先是被靜態(tài)鏈接的,靜態(tài)鏈接可以免去對(duì)lib目錄的依賴,且編譯menuconfig配置時(shí)設(shè)置了把/system/usr/bin,/system/usr/sbin一起合并到/system/bin,system/sbin中, --- 因?yàn)閘ib我們要將其做在usr文件夾中,與system,boot并列,sudo make install 編譯好后復(fù)制_install為根目錄下的/system,那個(gè)/system/linuxrc不要?jiǎng)h。

然后我們按照《將tinycolinux安裝在硬盤上》一文中的grub啟動(dòng)/boot下的kernel,具體我們測(cè)試用的kernel啟動(dòng)參數(shù)是:linux /boot/bzImage ro root=/dev/vda1 swapfile=vda1 local=vda3 home=vda3 opt=vda3 tce=vda3 init=/system/init,,,完整的grub菜單文本請(qǐng)參照那文查看。注意到init=/system/linuxrc,這是新加的一條參數(shù)。它定義了系統(tǒng)在引導(dǎo)系統(tǒng)時(shí)發(fā)現(xiàn)root=/dev/vda1后,完成系統(tǒng)將執(zhí)行權(quán)交給PID0來初始化文件系統(tǒng)的那個(gè)PID0,root只能是設(shè)備,對(duì)應(yīng)文件系統(tǒng)中的/,而init pid0可以是/下任意路徑下的一個(gè)可執(zhí)行程序,一段腳本。這段參數(shù)其實(shí)就是kernel轉(zhuǎn)手給通往rootfs init的連接器(其實(shí)你可以patch kernel中的init/main.c讓它加載你自己的init)。

業(yè)界有很多復(fù)雜化的init,如systemvinit等,tinycolinux也定義了它的腳本化init,在tinycolinux中,init是根下的init是一段腳本,但對(duì)于簡單的init,你可以將它直接鏈接到busybox中的init,在我們的測(cè)試環(huán)境,就是這么用的:linuxrc鏈接到system/bin/init,busybox init僅鏈接就能作為init使用是因?yàn)樗鋵?shí)包含了一系列默認(rèn)動(dòng)作,就像傳統(tǒng)init能做的那樣:它首先會(huì)查找etc/inittab,這個(gè)文件可以沒有,沒有的話,busybox init會(huì)執(zhí)行/etc/init.d/rcS,在這里它要執(zhí)行一些必要工作,所以我們還要準(zhǔn)備一些把busybox當(dāng)init用腳本和作一些初步工作:a)在/system下建立dev,etc,proc,sys四個(gè)空目錄,b)dev下準(zhǔn)備二個(gè)設(shè)備文件 mknod console c 5 1和mknod null c 1 3,然后: c)etc下提供fstab,inittab,init.d/rcS,其中inittab,rcS都加起執(zhí)行權(quán)限,內(nèi)容分別為:

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在普通方式下測(cè)試,證明這個(gè)文件系統(tǒng)是完善的,最終結(jié)果是進(jìn)入無誤進(jìn)入命令行。)。下面我們?cè)囍尰诟郊恿?system的rootfs運(yùn)行,直接改名原來tinycolinux的/bin/busybox,讓新的busybox生效,繼續(xù)如下測(cè)試,如果失敗有下列原因之一,在下列失敗可能和解決方案循環(huán)間不斷恢復(fù)云主機(jī)重新嘗試:

1)失敗可能:

提示kernel panic,說提供的init不可執(zhí)行,系統(tǒng)嘗試執(zhí)行tinycolinux /下的默認(rèn)init

warning:cant start default console

sbin/gettty not found之類之類

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

可見光是腳本文件不足于影響busybox的行為,由于我們企圖將etc這些東西歸類到/system/etc下,所以我們需要定制busybox中的路徑硬編碼部分以繼續(xù)測(cè)試:

2)解決方案:

改動(dòng)源碼:

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", "");

繼續(xù)編譯。

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

不斷測(cè)試,最終成功。系統(tǒng)啟動(dòng)過程無誤,最終出現(xiàn)正常命令行。當(dāng)然還有很多需改動(dòng)使這個(gè)rootfs變得更完善的空間。


為了維護(hù)這套干凈強(qiáng)大的文件系統(tǒng)設(shè)計(jì),用戶要注意在編譯程序時(shí)將其產(chǎn)生到/usr下,永遠(yuǎn)不要采用./configure 默認(rèn)無prefix的情況。

你可以整合tinycolinux的現(xiàn)有init邏輯,把tinyclinux的根文件系統(tǒng)改造成高定文件系統(tǒng),以如上在tinycolinux內(nèi)部循序漸進(jìn)地改動(dòng)進(jìn)行的方式。

到此,相信大家對(duì)“如何在tinycolinux上組建子目錄引導(dǎo)和混合32位64位的rootfs系統(tǒng)”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI