1. 程式人生 > >【原創】Linux 系統移植日誌----jffs2檔案系統定製

【原創】Linux 系統移植日誌----jffs2檔案系統定製

【原創】Linux 系統移植日誌—-jffs2檔案系統定製

DATE:2011-9-13

目標:
熟練u-boot、linux系統、檔案系統的優化裁剪;精通系統移植;精通linux系統、檔案系統、uboot原理等。

第一天,嘗試在AT91SAM9260 上進行linux系統移植,以前移植系統總希望所有的東西都是自己打造的,所以,移植時總時從0開始進行定製。由於自身知識、經驗的不足,導致在mini2440上的移植直到現在都沒有成功。嚴重影響了學習的積極性以及進度,所以,從今天起要改變學習的方法,從簡入手,先從最簡單的開始。

今天,利用系統自帶的u-boot、linux核心映像,自己定製jffs2檔案系統,學習檔案系統的定製方法。

按照廠家提供的方法,如下:

1、建立交叉編譯環境

SecureCRT ssh 到 ubuntu。

<1> 進入工作目錄,複製光碟資料 newmsg/tools/下的 arm-2007-01-21.iso

    cd /home/works
    cp newmsg/tools/arm-2007-01-21.iso ./
    mkdir tmp
    chmod 777 tmp
    mount -o loop mount –o loop arm-2007-01-21.iso ./tmp/

<2> 安裝交叉編譯工具

cd tmp
./install –d ../eldk41gcc40

<3> 設定交叉編譯工具路徑,如下:

vi ~/.bashrc

最後一行新增以下路徑,

export PATH=$PATH:/home/newmsg/works/tools/eldk41gcc40/usr/bin

<4>測試安裝

重新登入,使環境變數生效:

exit
sudo su

檢視交叉編譯工具版本,測試路徑是否正確,如下:

arm-linux-gcc –v

2、製作根檔案系統

本篇根檔案系統使用 busybox 製作,busybox 以小巧著稱,適合於嵌入式裝置的linux 檔案系統,下面是詳細的製作過程:
SecureCRT ssh 到 ubuntu,切換到 root。

<1> busybox 編譯

1>準備原始碼

    cd /home/newmsg/works
    tar –xzvf busybox-1.15.3.tar.gz
    cd busybox-1.15.3
    make clean distclean

make menuconfig 對busybox進行配置,去掉不需要的專案,最後生成.config檔案。

2>交叉編譯

make ARCH=arm CROSS_COMPILE=arm-linux- install

<2> 製作根檔案系統

1>建立根檔案系統基本架構

    cd /home/newmsg/works/nfsroot
    mkdir root usr mnt proc tmp var opt etc dev lib sys
    cp -a ../busybox-1.15.3/_install/* ./

2>新增必要的庫檔案

將arm-linux-gcc的庫檔案全部拷貝到lib目錄裡,例如我的arm-linux-gcc的安裝路徑為:/opt/arm_linux_gcc/usr/bin/arm-linux-gcc 則執行如下命令:

cp -a /opt/arm_linux_gcc/arm/lib/* ./lib/

3>新增必要裝置檔案

mknod ./dev/console c 5 1
mknod ./dev/null c 1 3
mknod ./dev/zero c 1 5

說明:如果在配置了busybox中的mdev選項,這些節點系統會自動生成,但是如果檔案系統建立前如果不顯式的建立這些節點,系統啟動時會報如下警告:

Warning: unable to open an initial console.
**原因:**mdev 是通過 init 程序來啟動的,在使用 mdev 構造 /dev 目錄之前,init 至少要用到裝置檔案/dev/console、 /dev/null ,所以需要事先建立這兩個裝置檔案。

注意:
本來console的主次裝置號應為5和1。但是因為init在執行完/etc/init.d/rcS指令碼後,就會在一個控制檯上,按照inittab的指示開一個shell(或者是開getty+login,這樣使用者就會看到提示輸入使用者名稱的提示符)。

在mdev -s未執行之前,/dev目錄下只有我們建立的/dev/null和/dev/console,也就是說,沒有控制檯可供init用來按照inittab 的指示開一個shell。

4>新增基本配置檔案

    cd etc
    mkdir init.d
    touch inittab init.d/rcS profile fstab   

vi inittab

新增以下內容(以下內容的原理和詳細解釋會在威步出品的同系列的手冊中找到,檢視《手冊使用介紹》即可找到相應手冊) :

    ::sysinit:/etc/init.d/rcS
    ttyS0::respawn:-/bin/sh
    ::restart:/sbin/init
    ::ctrlaltdel:/bin/umount -a –r

vi profile

新增以下內容:

    PATH=/bin:/sbin
    PS1='[\u@\h: \W]\$ '

說明:試驗中發現,如果配置busybox時沒有配置

Busybox Settings --->
                Busybox Library Tuning --->
                        [*] Username completion
                        [*] Fancy shell prompts

上面兩項,檔案系統是不會正確識別PS1這個環境變數的引數的。

vi fstab

新增以下內容:

    tmpfs  /tmp    tmpfs   defaults    0     0
    sysfs  /sys    sysfs   defaults    0     0

vi init.d/rcS

新增以下內容:

    /bin/mount -n -t proc /proc proc
    /bin/mount -n -o  remount,rw  /
    /bin/mount -av
    /bin/hostname NewMsg
    /bin/mount -t tmpfs mdev /dev
    mkdir /dev/pts
    /bin/mount -t devpts devpts /dev/pts
    echo /sbin/mdev>/proc/sys/kernel/hotplug
    /sbin/mdev –s

給 rcS 指令碼可執行許可權:

chmod 777 init.d/rcS

以上幾步,基本的根檔案系統已經構建完成,接下來就是製作檔案系統映象。

<3> 打包成指定格式的根檔案映象

cd /home/newmsg/works

製作成 jffs2 格式映象:
針對 64M 的 nand flash 使用者:

mkfs.jffs2 –r ./nfsroot –o rootfs.jffs2 –e 0x4000 –n –p
針對 128M 的 nand flash 使用者:
mkfs.jffs2 –r ./nfsroot –o rootfs.jffs2 –e 0x20000 –n -p

本試驗為128M的nand flash 。

<4> 燒寫映像、檔案系統

1>進入uboot,先設定以下引數:

setenv bootargs console=ttyS0,57600 root=/dev/nfs nfsroot=192.168.0.154:/home/nfsroot ip=192.168.0.219:192.168.0.154:192.168.0.1:255.255.255.0:::eth0:off    
setenv ipaddr 192.168.0.219    
setenv serverip 192.168.0.*    
setenv gatewayip 192.168.0.1

注:上面的serverip指是伺服器的ip,可自己設定, 一般在自己本機上執行tftp32.exe 即可當作一個ftp伺服器, 並把核心檔案(uImage_v1.*)放在tftp32.exe所在的目錄, 並將核心檔案的名字都改為uImage.

2>燒寫核心檔案

核心檔案放在伺服器的Kernel目錄下,其中有各個版本,詳見版本資訊 在uboot中執行以下命令,( 直接貼上即可 )

tftp 0x22000000 uImagenand erase 0xa0000nand write 0x22000000 0xa0000 0x200000

3>燒寫檔案系統

tftp 0x20000000 rootfs_128.jffs2
nand erase 0x400000
nand write 0x20000000 0x400000 0xxxxxxxxx

燒寫完畢重新啟動即可。
經過一天的忙碌,終於取得了以上成就,但是,還有很多疑問需要處理:
1> uboot 命令,燒寫位置是根據什麼確定的?
2> mkfs.jffs2 工具的使用方法
3> busybox各個選項的意義
4> nfs檔案系統的搭建,如何通過nfs登陸伺服器進行開發,系統燒寫
5> yaffs2檔案系統的移植,燒寫
6> linux系統移植
7> u-boot的修改
8> mdev
9> 嵌入式linux系統 登入密碼 賬號 管理