您好,登錄后才能下訂單哦!
本篇內容主要講解“如何在tinycolinux上組建子目錄引導和混合32位64位的rootfs系統”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何在tinycolinux上組建子目錄引導和混合32位64位的rootfs系統”吧!
在《在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位。
還記得我們開頭談到至簡的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系統”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。