【原創】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系統 登入密碼 賬號 管理