中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在tinycolinux上組建子目錄引導和混合32位64位的rootfs系統

發布時間:2021-11-30 09:21:37 來源:億速云 閱讀:145 作者:iii 欄目:大數據

本篇內容主要講解“如何在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系統”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新邵县| 吉木乃县| 南雄市| 湘乡市| 沾化县| 绥宁县| 阳江市| 上高县| 丰台区| 宜良县| 许昌市| 扎鲁特旗| 南投县| 乃东县| 渑池县| 拉孜县| 嘉定区| 东乡族自治县| 南投市| 海林市| 云和县| 垫江县| 永善县| 通江县| 革吉县| 雷波县| 德阳市| 翁源县| 辽中县| 固原市| 兴义市| 黎川县| 富阳市| 宝坻区| 房产| 宣汉县| 湘潭县| 华安县| 中阳县| 九龙坡区| 临清市|