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

公司主營業(yè)務(wù):做網(wǎng)站、成都網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出利州免費做網(wǎng)站回饋大家。
在《在tinycolinux32上裝64位toolchain》文中,我們提到產(chǎn)生的64位程序不能運行,甚至ldd都不能分析出其引用,僅提示wrong elf64class,直接執(zhí)行也提示not found,這是因為它找不到64位共享庫,由于ldd無法使用,我們通過其它手段分析,發(fā)現(xià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,你可以把它做起對應(yīng)軟鏈一同放在/lib64中,其實不做也可以,因為它們被引用在了/usr/local/gcc443/x86_64-pc-linux-gnu/lib這個是由編譯工具鏈時hardcoded指定的,還有l(wèi)ibstdc++.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加起執(zhí)行權(quán)限來(這個至關(guān)重要,否則會提示access corrupt shared libraries),然后把上述的文件各自復制到其所在目錄。執(zhí)行64位測試程序,發(fā)現(xiàn)能成功運行!
這樣,tinycolinux就擁有了二套GCC支持開發(fā)和運行的程序,所在的文件系統(tǒng),一套在/lib下,一套在/lib64下。分別同時支持32位和64位。
還記得我們開頭談到至簡的rootfs就是busybox+一些init腳本嗎,我們不斷提到的busybox是一個產(chǎn)生rootfs的基礎(chǔ)和中心,總管,它自包含我們建立這個測試環(huán)境需要的一切,我們來使用它建立這個最簡的rootfs樣本:
我們是在tinycolinux本身帶有GCC481的環(huán)境下測試的,為了方便測試使用云主機,使用快照隨時準備備份恢復重來,使用的tinycolinux它自己就有rootfs。根目錄下有個init,/bin下有個busybox,注意到這些細節(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個patch并運用到解包后的源文件,按《tinycolinux上硬盤安裝》一文準備sudo make menuconfig并運用config,為了我們的分離式文件夾系統(tǒng),busybox事先是被靜態(tài)鏈接的,靜態(tài)鏈接可以免去對lib目錄的依賴,且編譯menuconfig配置時設(shè)置了把/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啟動參數(shù)是:linux /boot/bzImage ro root=/dev/vda1 swapfile=vda1 local=vda3 home=vda3 opt=vda3 tce=vda3 init=/system/init,,,完整的grub菜單文本請參照那文查看。注意到init=/system/linuxrc,這是新加的一條參數(shù)。它定義了系統(tǒng)在引導系統(tǒng)時發(fā)現(xiàn)root=/dev/vda1后,完成系統(tǒng)將執(zhí)行權(quán)交給PID0來初始化文件系統(tǒng)的那個PID0,root只能是設(shè)備,對應(yīng)文件系統(tǒng)中的/,而init pid0可以是/下任意路徑下的一個可執(zhí)行程序,一段腳本。這段參數(shù)其實就是kernel轉(zhuǎn)手給通往rootfs init的連接器(其實你可以patch kernel中的init/main.c讓它加載你自己的init)。
業(yè)界有很多復雜化的init,如systemvinit等,tinycolinux也定義了它的腳本化init,在tinycolinux中,init是根下的init是一段腳本,但對于簡單的init,你可以將它直接鏈接到busybox中的init,在我們的測試環(huán)境,就是這么用的:linuxrc鏈接到system/bin/init,busybox init僅鏈接就能作為init使用是因為它其實包含了一系列默認動作,就像傳統(tǒng)init能做的那樣:它首先會查找etc/inittab,這個文件可以沒有,沒有的話,busybox init會執(zhí)行/etc/init.d/rcS,在這里它要執(zhí)行一些必要工作,所以我們還要準備一些把busybox當init用腳本和作一些初步工作:a)在/system下建立dev,etc,proc,sys四個空目錄,b)dev下準備二個設(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在普通方式下測試,證明這個文件系統(tǒng)是完善的,最終結(jié)果是進入無誤進入命令行。)。下面我們試著讓基于附加了/system的rootfs運行,直接改名原來tinycolinux的/bin/busybox,讓新的busybox生效,繼續(xù)如下測試,如果失敗有下列原因之一,在下列失敗可能和解決方案循環(huán)間不斷恢復云主機重新嘗試:
1)失敗可能:
提示kernel panic,說提供的init不可執(zhí)行,系統(tǒng)嘗試執(zhí)行tinycolinux /下的默認init
warning:cant start default console
sbin/gettty not found之類之類
可以看到sh,但ls ,which not found
可見光是腳本文件不足于影響busybox的行為,由于我們企圖將etc這些東西歸類到/system/etc下,所以我們需要定制busybox中的路徑硬編碼部分以繼續(xù)測試:
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", "");繼續(xù)編譯。
cd /tce/busybox sudo make clean sudo make install sudo cp _install/system/bin/busybox /system/bin
不斷測試,最終成功。系統(tǒng)啟動過程無誤,最終出現(xiàn)正常命令行。當然還有很多需改動使這個rootfs變得更完善的空間。
為了維護這套干凈強大的文件系統(tǒng)設(shè)計,用戶要注意在編譯程序時將其產(chǎn)生到/usr下,永遠不要采用./configure 默認無prefix的情況。
你可以整合tinycolinux的現(xiàn)有init邏輯,把tinyclinux的根文件系統(tǒng)改造成高定文件系統(tǒng),以如上在tinycolinux內(nèi)部循序漸進地改動進行的方式。
到此,相信大家對“如何在tinycolinux上組建子目錄引導和混合32位64位的rootfs系統(tǒng)”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!
分享題目:如何在tinycolinux上組建子目錄引導和混合32位64位的rootfs系統(tǒng)
網(wǎng)址分享:http://chinadenli.net/article0/jhgjoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、自適應(yīng)網(wǎng)站、手機網(wǎng)站建設(shè)、用戶體驗、品牌網(wǎng)站制作、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)