【移植Linux 3.4.2内核第三步】从0制作支持新内核的文件系统
學習交流加
- 個人qq:
1126137994 - 個人微信:
liu1126137994 - 學習交流資源分享qq群:
962535112
上一篇文章,我們修改了內核代碼改了系統的分區,但是最后啟動,發現雖然我們可以掛載之前的文件系統,但是無法啟動init進程。說明我們新移植的內核不支持我們之前制作的老的文件系統(點擊查看上一篇文件:上一篇文章)。今天我們來制作新的文件系統。
我們用的是哪一個編譯器編譯的內核,就用哪一個編譯器編譯文件系統的應用程序:
1.編譯Busybox
獲取busybox源碼1.20.0版本的(下載地址:下載地址),把下載好的源碼拿到Linux系統解壓,進入到源碼目錄:
然后直接:
make menuconfig (交叉編譯)
出現如下界面:
選擇:
Busybox Settings —>
Build Options —>
Cross Compiler prefix (NEW)
然后會出現可以輸入的橫條,在里面輸入我們的編譯器的前綴:
配置好后,退出保存保存配置。
然后直接輸入:
make (編譯)
編譯完成后,我們把它安裝到/work/nfs_root目錄下,進入到這個目錄,建立一個目錄:
mkdir fs_mini_mdev_new (新的文件系統目錄)
然后切換到busybox目錄,進行安裝(安裝命令可以查看README):
make install CONFIG_PREFIX=/work/nfs_root/fs_mini_mdev_new
第一步已經完成,busybox已經安裝好,下一步是安裝庫。
2.安裝庫
我們查看到我們的編譯工具的路徑:
echo $PATH
得知編譯工具的路徑為:
/work/tools/usr/local/arm/4.3.2/bin
進入到這個目錄
/work/tools/usr/local/arm/4.3.2
輸入find -name lib
找到很多庫如下:
用到的庫只有這兩個:
./arm-none-linux-gnueabi/libc/armv4t/usr/lib
./arm-none-linux-gnueabi/libc/armv4t/lib
我們只需要把這兩個庫拷貝過來就行:
先在fs_mini_mdev_new目錄下建立以lib目錄:
然后把/work/tools/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib目錄下的所有.so文件拷貝到fs_mini_mdev_new目錄下的lib目錄:
還有一個庫需要添加:
在/work/nfs_root/fs_mini_mdev_new/usr目錄下創建一個lib目錄,然后把編譯器中的usr/lib目錄下的庫拷貝過來:
庫已經添加完了,接下來是構造一些其他目錄(etc,dev目錄等):
3.構造etc目錄:
3.1創建etc/inittab文件
在/work/nfs_root/fs_mini_mdev_new目錄下,創建inittab文件,里面內容如下:
3.2創建etc/init.d/rcS文件
這是一個腳本問價,可以在里面添加想自動執行的命令。以下命令配置IP地址、掛接/etc/fstab指定的文件系統。
其中:
第一行表示這是一個腳本文件,運行時使用/bin/sh解析。
第三行掛接/etc/fstab文件指定的所有文件系統。
最后還要更改它的屬性,使它能夠執行:
3.3、創建etc/fstab文件
內容如下,表示執行“mount -a”命令后將掛接proc、tmpfs文件系統
4.構建dev目錄
該目錄下存放的是設備文件。設備文件是Linux系統中特有的文件類型,在Linux系統下,以文件的方式訪問各種外設,即通過讀寫某個設備文件來操作某個具體硬件。比如通過“/dev/ttySAC0”文件可以操作串口0,通過“/dev/mtdblock1”可以訪問MTD設備(NAND Flash、NOR Flash等)的第二個分區。
/dev的創建有3種方法。
(1)手動創建
在制作根文件系統的時候,就在/dev目錄下創建需要操作的設備文件比如ttySAC0等。系統掛接根文件系統后,就可以使用/dev目錄下的設備文件了。
(2)使用devfs文件系統:這種方法已經過時
(3)使用udev
udev是一個用戶程序,它能夠根據系統中硬件設別的狀態更新設備文件,包括設備文件的創建、刪除等。
使用udev機制也不需要在/dev目錄下創建設備節點,它需要一些用戶程序的支持,并且內核要支持sysfs文件系統。它的操作比較復雜,但是靈活性比較高。
在busybox中,有一個mdev命令,它是udev命令的簡化版。
那么我們就使用mdev來創建設備文件
要在內核啟動時自動運行mdev,需要修改etc/fstab文件來自動掛載文件系統、修改etc/init.d/rcS文件加入要自動運行的命令。
*etc/fstab的修改:
*etcinit.d/rcS的修改:
#!/bin/sh ifconfig eth0 192.168.1.104 mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s另外,mdev是通過init進程來啟動的,在使用mdev構造/dev目錄之前,init進程至少要用到的設備文件為/dev/console和/dev/null,所以要建立這兩個文件:
mkdir dev cd dev sudo mknod console c 5 1 sudo mknod null c 1 35.構建其他目錄
其他目錄可以是空目錄,如下:
現在我們的/work/nfs_root/fs_mini_mdev_new目錄下就是一個非常小的根文件系統。開發板可以將它作為網絡根文件系統直接啟動。如果要燒寫進開發板,還要將它制作為一個文件,稱為映像文件。
6.制作文件系統映像文件
接下來,我們來制作文件系統的映像文件:
6.1首先需要編譯制作jffs2映像文件的工具(具體源碼可以自行下載,也可以加我q1126137994問起要)
在我的Linux系統目錄/work/tools/mtd-utils-05.07.23.tar.bz2是MTD設備的工具包,編譯它生成mkfs.jffs2工具,用它來將一個目錄制作成jffs2文件系統映像文件。
這個工具包需要zlib壓縮包,先安裝zlib。在我的目錄/work/GUI/xwindow/X/deps下有zlib源碼zlib-1.2.3.tar.gz,執行以下命令進行安裝:
cd /work/GUI/xwindow/X/deps
tar xzf zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure --shared --prefix=/usr
make
sudo make install
然后編譯mkfs.jffs2
cd /work/tools
tar xjf mtd-utils-05.07.23.tar.bz2
cd mtd-utils-05.07.23/util
make
sudo make install
6.2制作jffs2映像文件
使用如下命令:
cd /work/nfs_root/fs_mini_dev_new (這是我自己的目錄,根據個人的不同進入到不同的目錄)
mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_newlyy.jffs2
上面-n 表示不要在每個擦除塊上都加上清楚標志,-s 2018 表示我們的NAND Flash的一頁的大小為2048字節,-e 128KiB 表示一個擦除快大小為128KiB ,-d 表示根文件系統的目錄,-o表示輸出的文件。
好了,文件系統制作完畢了。下面我們來燒寫系統:
nfs 30000000 192.168.1.101:/work/nfs_root/fs_mini_mdev_newlyy.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 260000 $filesize
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
nfs 32000000 192.168.1.101:/work/nfs_root/uImage_new
bootm 32000000
串口打印,可以正常啟動了,整個系統終于跑起來了,哈哈哈:
完美!!!費了這么大的功夫,終于搞定了這個文件系統的制作,還好沒有出現什問題。
注釋:
在視頻教程中,出現了錯誤:Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000200。
分析這個錯誤:在內核中搜索字符串:exitcode,通過函數層層調用的分析,最終找到:do_exit(SIGKILL);執行了這個調用,才出現錯誤代碼4,原因是編譯內核用的編譯工具是eabi接口的,我們需要重新配置內核使用EABI接口:
在內核目錄下輸入:
make meniconfig
然后依次選擇:
Kernel Features —>
[*] Use the ARM EABI to compile the kernel
這下應該就完全沒有問題了,內核配置好后,重新編譯燒寫啟動,就OK啦!!!!
想一起探討以及獲得各種學習資源加我(有我博客中寫的代碼的原稿):
qq:1126137994
微信:liu1126137994
可以共同交流關于嵌入式,操作系統,C++語言,C語言,數據結構等技術問題。
總結
以上是生活随笔為你收集整理的【移植Linux 3.4.2内核第三步】从0制作支持新内核的文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 028_adblock
- 下一篇: Springboot拼接实体类里面的UR