2008年1月10日 星期四

Linux下DOM製作流程

製作系統盤現在使用32M電子盤(DOM)。以下比較詳細的說明怎樣製作一個嵌入式Linux系統盤。

1. 首先可以先把電子盤掛到一台機器上作為從盤,使用PQMagic分區工具進行分區操作,因為DOS分區所有內容只有1.56M,所以第一個分區只需要2M就足夠了。分區類型是基本分區(primary),文件系統類型是FAT,並且設為活動分區(A ctive)。

2. Linux分區可以現在分好,也可以等製作文件系統時再分。現在分可以把剩餘空間都作為第二個分區。分區類型是基本分區(primary),文件系統類型是Linux Ext2。

3. 重啟機器,可以看到一個兩兆的分區。把編譯好的Linux內核和DOS加載工具等內容(見系統文件清單)全部拷到這個分區上,第一個分區就做好了。如果分了三個區,而且想把第三個分區作為工作分區,則需要把AUTOEXEC.BAT中的工作分區指向 /dev/hda2 改為/dev/hda3即可。

4. 在機器上安裝一個Linux系統,把電子盤掛在IDE2上。如果沒有進行第二步操作,打開一個終端,進行分區和製作文件系統操作。
fdisk /dev/hdd
回車,出現提示,輸入p,可以看見現在hdd的分區狀態;
輸入n,增添分區,回車;
輸入2,指定設備號,回車;
輸入3,指定起始柱面號,回車;
輸入+30M,指定分區大小,回車;
輸入w,把剛才的分區設置寫入分區表;
mkfs.ext2 /dev/hdd2,製作文件系統,類型是ext2。
mount /dev/hdd2 /mnt,加載到主盤的mnt下

5. 現在開始製作第二個分區上的文件系統。因為原有文件系統大約有53M左右,必須有所刪減。而其中最大的是lib,大約佔了40M,而使用lib中庫的主要是bin和sbin中的工具。因而使用了嵌入式Linux常用的busybox和tinylog in。
從網上下載了busybox-1.00-pre3.tar和tinylogin-1.4.tar,把busybox-1.00-pre3.tar解壓到一個指定的目錄下。
運行「make menuconfig」命令,選擇想要在工作系統中使用的工具。保存設置。
找到init目錄下的init.c文件,找到 INIT_SCRIPT "/etc/init.d/rcS",更改為「/etc/rc」。
看Makefile中是否有「DOSTATIC = false」,如果有,改false為true,使busybox靜態編譯。
修改了/usr/include/asm/errno.h頭文件中27行的一個錯行,否則編譯通不過。
在當前目錄下用命令「make menuconfig」進入工具選擇界面,選項如下所示:
進入「Build Options」 ,選擇「Build Busybox as a static binary」選項;
進入「Archival Utilities」 ,選擇「gunzip, gzip, tar」 選項;
進入「Console Utilities」 ,選擇「clear, reset」 選項;
進入「Finding Utilities」 ,選擇「find, grep」 選項;
進入「Init Utilities」 ,選擇全部的選項;
進入「Login/Password Management Utilities」 ,選擇除第一項和最後兩項的全部選項;
進入「Linux Module Utilities」 ,選擇全部的選項;
進入「Networking Utilities」 ,選擇「arping, ftpget, ftpput, hostname, ifconfig下一共5項, ifupdown, use busybox ifconfig and route applets, Enable support for IPV4, Enable support for IPX, Enable mapping support, inetd全選,ip全選, ipcalc全選, netstat, nslookup, ping, telnet, telnetd」 選項;
進入「Process Utilities」 ,選擇「free, kill, killall, ps, uptime」 選項;
進入「Linux System Utilities」 ,選擇「dmesg, fdisk, write support, 」 選項,其餘默認。
別的其他選項默認,保存退出。

make,在當前目錄下生成一個大約800k的「busybox」,就是我們所需要的了。把它拷到mnt下的bin目錄下。然後就可以把自己想要的工具在bin下面建立一個鏈接就可以了。如:
ln –s busybox cp
ln –s busybox ls
……
對於tinylogin,操作和busybox完全相同。也要靜態編譯,然後把login,passwd,adduser等帳戶管理的工具建立和tinylogin的鏈接即可。需要注意的是有些工具是在sbin當中的,所以也可以把tinylogin拷到 sbin目錄下,bin下的工具要想鏈接到tinylogin,可以如下操作:
ln –s tinylogin ../bin/login

6. 有些bin和sbin下的工具是busybox和tinylogin中所沒有的,必須從完整的系統中拷過來,例如在這個系統中,由於選擇vi時編譯出錯,所以vi是直接從主盤上拷過來的,而且必須把這個工具使用的相應的庫也拷到lib下面。如使用 ldd vi,就可以看到vi使用了哪些庫,然後把這些庫拷到/mnt/lib下就可以了。

7. 在bin中還有兩個命令ro和rw,是自己定義的兩個可執行腳本。作用是使系統變更為只讀和可讀寫,也要拷到bin下面。


8. 在lib中建立目錄modules和tls,使用命令mkdir modules和 mkdir tls。把原來lib中這兩個目錄下的東西拷過來即可。把應用程序所需要的cpr-2.0.1.so和jpeg-6a.so拷到lib中。這樣bin,sbin和lib就做好了。這樣lib只有8M左右。

9. 把剩下的目錄etc、dev、proc、usr、var、boot、mnt和root全部拷到mnt目錄下。因為要求系統不使用頁面交換,所以在etc下的rc腳本中添加了一句swapoff –a
如果需要新添加用戶或者更改用戶密碼,還需要建立一個home目錄。

10.這時mnt下所用空間大小大約是16M左右。umount /mnt,電子盤就可以在工作機上啟動了。

以下是各目錄中建立鏈接的詳細清單:
bin:
ln –s busybox ash
ln –s busybox cat
ln –s busybox chmod
ln –s busybox chown
ln –s busybox chroot
ln –s busybox chvt
ln –s busybox clear
ln –s busybox cp
ln –s busybox cut
ln –s busybox date
ln –s busybox dd
ln –s busybox df
ln –s busybox dirname
ln –s busybox dmesg
ln –s busybox du
ln –s busybox echo
ln –s busybox env
ln –s busybox false
ln –s busybox find
ln –s busybox grep
ln –s busybox gunzip
ln –s busybox gzip
ln –s busybox head
ln –s busybox hostname
ln –s busybox id
ln –s busybox insmod
ln –s busybox kill
ln –s busybox killall
ln –s busybox klogd
ln –s busybox linuxrc
ln –s busybox ln
ln –s busybox logger
ln –s ../sbin/tinylogin login
ln –s busybox ls
ln –s busybox mkdir
ln –s busybox mkswap
ln –s busybox more
ln –s busybox mount
ln –s busybox mv
ln –s busybox netstat
ln –s ../sbin/tinylogin passwd
ln –s busybox pidof
ln –s busybox ps
ln –s busybox pwd
ln –s busybox reset
ln –s busybox rm
ln –s busybox rmdir
ln –s busybox route
ln –s busybox sh
ln –s busybox sleep
ln –s busybox sort
ln –s ../sbin/tinylogin su
ln –s busybox sync
ln –s busybox tar
ln –s busybox test
ln –s busybox touch
ln –s busybox true
ln –s busybox tty
ln –s busybox umount
ln –s busybox uname
ln –s busybox uptime
ln –s busybox wc
ln –s busybox zcat

sbin:
ln –s tinylogin addgroup
ln –s tinylogin adduser
ln –s tinylogin delgroup
ln –s tinylogin deluser
ln –s tinylogin sulogin

lib:
ln –s ld-2.3.2.so ld-linux.so.2
ln –s libacl.so.1.0.3 libacl.so.1
ln –s libattr.so.1.0.1 libattr.so.1
ln –s libc-2.3.2.so libc.so.6
ln –s libcom_err.so.2.0 libcom_err.so.2
ln –s libcrypt-2.3.2.so libcrypt.so.1
ln –s libdl-2.3.2.so libdl.so.2
ln –s libe2p.so.2.3 libe2p.so.2
ln –s libext2fs.so.2.4 libext2fs.so.2
ln –s libgcc_s-.3.2.2-20030225.so.1 libgcc_s.so.1
ln –s libm-2.3.2.so libm.so.6
ln –s libnss1_files-2.2.4.so libnss1.so.1
ln –s libnss_files-2.2.4.so libnss_files.so.1
ln –s libnss_files-2.3.2.so libnss_files.so.2
ln –s libpam.so.0.75 libpam.so.0
ln –s libpthread-0.10.so libpthread.so.0
ln –s libresolv-2.3.2.so libresolv.so.2
ln –s libtermcap.so.2.0.8 libtermcap.so.2
ln –s libutil-2.3.2.so libutil.so.1
ln –s libuuid.so.1.2 libuuid.so.1
lib/tls:
ln –s libc-2.3.2.so libc.so.6
ln –s libm-2.3.2.so libm.so.6
ln –s libpthread-0.10.so libpthread.so.0

沒有留言: