歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> 更多Linux >> 我也來學做嵌入式Linux系統V0.1二

我也來學做嵌入式Linux系統V0.1二

日期:2017/2/27 9:30:54   编辑:更多Linux
  第四章 建立根文件系統    1、建立目錄    構建工作空間時,rootfs文件夾用來存放根文件系統,    #cd rootfs    根據根文件系統的基本結構,建立各個對應的目錄:    # mkdir bin dev etc lib proc sbin tmp usr var root home  # chmod 1777 tmp  # mkdir usr/bin usr/lib usr/sbin  # ls  dev etc lib proc sbin tmp usr var  # mkdir var/lib var/lock var/log var/run var/tmp  # chmod 1777 var/tmp    對於單用戶系統來說,root和home並不是必須的。    准備好根文件系統的骨架後,把前面建立的文件安裝到對應的目錄中去。    2、拷貝鏈接庫    把UClibc的庫文件拷貝到剛才建立的lib文件夾中:    # cd ${PREFIX}/lib  [root@skynet lib]# cp *-*.so ${PRJROOT}/rootfs/lib  [root@skynet lib]# cp -d *.so.[*0-9] ${PRJROOT}/rootfs/lib    3、 拷貝內核映像和內核模塊    因為沒有模塊,所以拷貝模塊就省了,    新建boot目錄,把剛才建立好的內核拷貝過來    # cd /home/kendo/control-project/daq-module/rootfs/  # mkdir boot  # cd ${PRJROOT}/images  # cp bzImages-2.4.18-rmk5 /home/kendo/control-project/daq-module/rootfs/boot    4、 建立/dev下邊的設備文件    在Linux中,所有的的設備文件都存放在/dev中,使用mknod命令創建基本的設備文件。    mknod命令需要root權限,不過偶本身就是用的root用戶,本來是新建了一個用戶專門用於嵌入式制作的,不過後來忘記用了……    # mknod -m 600 mem c 1 1  # mknod -m 666 null c 1 3  # mknod -m 666 zero c 1 5  # mknod -m 644 random c 1 8  # mknod -m 600 tty0 c 4 0  # mknod -m 600 tty1 c 4 1  # mknod -m 600 ttyS0 c 4 64  # mknod -m 666 tty c 5 0  # mknod -m 600 console c 5 1    基本的設備文件建立好後,再創建必要的符號鏈接:    # ln -s /proc/self/fd fd  # ln -s fd/0 stdin  # ln -s fd/1 stdout  # ln -s fd/2 stderr  # ls  console fd mem null random stderr stdin stdout tty tty0 tty1 ttyS0 zero    設備文件也可以不用手動創建,聽說RedHat /dev下的腳本MAKEDEV 可以實現這一功能,不過沒有試過……    基本上差不多了,不過打算用硬盤/CF卡來做存儲設備,還需要為它們建立相關文件,因為我的CF在目標機器上是CF-to-IDE,可以把它們等同來對待,先看看Redhat 下邊had的相關屬性:    # ls -l /dev/hda  brw-rw----  1 root   disk    3,  0 Jan 30 2003 /dev/hda  # ls -l /dev/hda1  brw-rw----  1 root   disk    3,  1 Jan 30 2003 /dev/hda1    對比一下,可以看出,had類型是b,即塊設備,主編號為3,次編號從0遞增,根限位是rw-rw----,即660,所以:    # mknod -m 660 hda b 3 0  # mknod -m 660 hda1 b 3 1  # mknod -m 660 hda2 b 3 2  # mknod -m 660 hda3 b 3 3    5、添加基本的應用程序    未來系統的應用程序,基本上可以分為三類:    基本系統工具,如ls、ifconfig這些……    一些服務程序,管理工具,如WEB、Telnet……    自己開發的應用程序    這裡先添加基本的系統工具,有想過把這些工具的代碼下載下來交叉編譯,不過實在是麻煩,用BusyBox,又精簡又好用……    將busybox-1.00.tar.gz下載至sysapps目錄下,解壓:    #tar zxvf busybox-1.00.tar.gz  #cd busybox-1.00    //進入配置菜單    #make TARGET_ARCH=i386 CROSS=i386-linux- PREFIX=${PRJROOT}/rootfs menuconfig    //建立依存關系    #make TARGET_ARCH=i386 CROSS= i386-linux- PREFIX=${PRJROOT}/rootfs dep    //編譯    #make TARGET_ARCH=i386 CROSS= i386-linux- PREFIX=${PRJROOT}/rootfs    //安裝    #make TARGET_ARCH=i386 CROSS= i386-linux- PREFIX=${PRJROOT}/rootfs install    # cd ${PRJROOT}/rootfs/bin  # ls  addgroup busybox chown delgroup echo   kill  ls   mv    ping rm   sleep  adduser  chgrp  cp   deluser  grep   ln   mkdir netstat ps  rmdir umount  ash    chmod  date  dmesg   hostname login mount pidof  pwd  sh   vi    一下子多了這麼多命令……    配置busybox的說明:    A、如果編譯時選擇了:    Runtime SUID/SGID configuration via /etc/busybox.conf    系統每次運行命令時,都會出現“Using fallback suid method ”    可以將它去掉,不過我還是在/etc為其建了一個文件busybox.conf搞定;    B、[*] Do you want to build BusyBox with a Cross Compiler?                   (i386-linux-gcc) Cross Compiler prefix    這個指明交叉編譯器名稱(其實在編譯時的命令行已指定過了……)    C、安裝選項下的(${PRJROOT}/rootfs) BusyBox installation prefix,這個指明了編譯好後的工具的安裝目錄。    D、靜態編譯好還是動態編譯好?即是否選擇    [ ] Build BusyBox as a static binary (no shared libs)    動態編譯的最大好處是節省了寶貴空間,一般來說都是用動態編譯,不過我以前動態編譯出過問題(其實是庫的問題,不關busybox的事),出於慣性,我選擇了靜態編譯,為此多付出了107KB的空間。    E、其它命令,根據需要,自行權衡。    6、系統初始化文件    內核啟動時,最後一個初始化動作就是啟動init程序,當然,大多數發行套件的Linux都使用了與System V init相仿的init,可以在網上下載System V init套件,下載下來交叉編譯。另外,我也找到一篇寫得非常不錯的講解如何編寫初始化文件的文件,bsd-init,回頭附在後面。不過,對於嵌入式系統來講,BusyBox init可能更為合適,在第6步中選擇命令的時候,應該把init編譯進去。    #cd ${PRJROOT}/rootfs/etc  #vi inittab    我的inittal文件如下:    #指定初始化文件    ::sysinit:/etc/init.d/rcS    #打開一個串口,波特率為9600    ::respawn:/sbin/getty 9600 ttyS0    #啟動時執行的shell    ::respawn:/bin/sh    #重啟時動作    ::restart:/sbin/init    #關機時動作,卸載所有文件系統    ::shutdown:/bin/umount -a –r    保存退出;    再來編寫rcS腳本:    #mkdir ${PRJROOT}/rootfs/etc/init.d  #cd ${PRJROOT}/rootfs/etc/init.d  #vi rcS    我的腳本如下:    #!/bin/sh    #Set Path  PATH=/sbin:/bin  eXPort PATH    syslogd -m 60  klogd    #install /proc  mount -n -t proc none /proc    #reinstall root file system by read/write mode(need: /etc/fstab)  mount -n -o remount,rw /    #reinstall /proc  mount -n -o remount,rw -t proc none /proc    #set lo ip address  ifconfig lo 127.0.0.1    #set eth0 ip address    #當然,這樣子做只是權宜之計,最後做的應該是在這一步引導網絡啟動腳本,像RedHat    #那樣,自動讀取所有指定的配置文件來啟動    ifconfig eth0 192.168.0.68 netmask 255.255.255.0    #set route    #同樣的,最終這裡應該是運行啟動路由的腳本,讀取路由配置文件    route add default gw 192.168.0.1    #還差一個運行服務程序的腳本,哪位有現成的麼?    #網卡/路由/服務這三步,事實上可以合在一步,在rcS這一步中,做一個循環,運行指定啟動目錄下的所有腳,先將就著這麼做吧,確保系統能夠正常啟動了,再來寫這個腳本。    #set hostname  hostname MyLinux    保存退出。    編寫fstab文件    #vi fstab    我的fstab很簡單:    /dev/hda1 / ext2 defaults 1 1  none /proc proc defaults 0 0    第五章 讓MyLinux能夠啟動    前一章,我們把編譯好的內核、應用程序、配置文件都拷貝至rootfs目錄對應的子目錄中去了,這一步,就是把這些文件移植至目標機的存儲器。這裡,我是先另外拿一塊硬盤,掛在我的開發機上做的測試,因為我的本本用來寫文檔,PC機用來做開發機,已經沒有另外的機器了……但是本章只是講述一個一般性的過程,並不影響你直接在目標主機上的工作。    因為以後目標機識別硬盤序號都是hda,而我現




Copyright © Linux教程網 All Rights Reserved