先確定有/etc下的passwd、group、shadow檔案,如果沒有,可以新增檔案內容如下
passwd:
root:x:0:0:root:/root:/bin/sh
group:
root:x:0:
shadow:
root::12179:0:99999:7:::
使用inetd來管理server,所以在新增/etc/inetd.conf,內容新增
21 stream tcp nowait root ftpd ftpd -w /root
可以看到最後是指明anonymous登入的目錄,執行指令inetd即可,可以使用netstat -npl觀察ftp server有沒有啟動
如果沒看到可以檢查看看inetd是否有執行
2012年3月18日 星期日
2012年3月17日 星期六
編譯open ssl與wpa_supplicant(補)
本以為高高興興的編譯過之後,接下來就是完成無線網卡的module就可以快快樂樂得上菜網了,結果才知道自己天真了orz
首先是怎樣都無法wpa_supplicant成功,仔細看了許久的設定檔案,應該沒有錯誤(改過幾種),或者版本有問題(另外試驗0.61),再來懷疑是openssl沒有編譯好,找了幾個編譯版本,還修改了些參數(目前還是沒有編譯出.so,但是有編譯出.a),跟著甚至把ssl的lib用static link到wpa_supplicant裡面;又或者懷疑busybox是不是有問題,哪些tool沒裝?
最後才發現,原來要改kernel阿~~~囧~必須要打開CONFIG_PACKET選項阿~~~
好啦,打開之後,發現wpa_supplicant可以過了,想不到事情還沒結束,先看看需要dhcp,那表示我要編譯dhcpclient囉?嗯嗯~busybox有簡易的版本udhcpc,那就使用吧,用了之後竟然完全好似沒有作用!?去開AP的設定來看,有連上來阿~也分配了位置,又是上網爬文,發現原來udhcpc並不會自動更改設定,要透過script,在busybox解開的目錄內$(busybox)/examples/udhcp/simple.script,拷貝到機器上變成/usr/share/udhcpc/default.script,這樣一來只要使用updhcpc -i wlan0,ifconfig就可以看到系統自動幫我們設定好ip、netmask、nameserver...,應該可以上網了吧,ping又失敗了..............真的無力到了極點,我又開始"疑神疑鬼"了,最後答案是.....
原來的route路徑跟wlan衝突阿.....eth0跟wlan0兩者都是192.168.1.x的網域,所以系統大概先註冊先贏,率先去使用eth0的路徑吧orz,最後先把eth0關閉,終於可以上網了,真的是遠兜轉了
這只能說,desktop distribution還真的方便許多,嵌入式系統還真多東西自己要take care
首先是怎樣都無法wpa_supplicant成功,仔細看了許久的設定檔案,應該沒有錯誤(改過幾種),或者版本有問題(另外試驗0.61),再來懷疑是openssl沒有編譯好,找了幾個編譯版本,還修改了些參數(目前還是沒有編譯出.so,但是有編譯出.a),跟著甚至把ssl的lib用static link到wpa_supplicant裡面;又或者懷疑busybox是不是有問題,哪些tool沒裝?
最後才發現,原來要改kernel阿~~~囧~必須要打開CONFIG_PACKET選項阿~~~
好啦,打開之後,發現wpa_supplicant可以過了,想不到事情還沒結束,先看看需要dhcp,那表示我要編譯dhcpclient囉?嗯嗯~busybox有簡易的版本udhcpc,那就使用吧,用了之後竟然完全好似沒有作用!?去開AP的設定來看,有連上來阿~也分配了位置,又是上網爬文,發現原來udhcpc並不會自動更改設定,要透過script,在busybox解開的目錄內$(busybox)/examples/udhcp/simple.script,拷貝到機器上變成/usr/share/udhcpc/default.script,這樣一來只要使用updhcpc -i wlan0,ifconfig就可以看到系統自動幫我們設定好ip、netmask、nameserver...,應該可以上網了吧,ping又失敗了..............真的無力到了極點,我又開始"疑神疑鬼"了,最後答案是.....
原來的route路徑跟wlan衝突阿.....eth0跟wlan0兩者都是192.168.1.x的網域,所以系統大概先註冊先贏,率先去使用eth0的路徑吧orz,最後先把eth0關閉,終於可以上網了,真的是遠兜轉了
這只能說,desktop distribution還真的方便許多,嵌入式系統還真多東西自己要take care
2012年3月13日 星期二
micro2440移植busybox 1.19.x
- 基本上就跟前面busybox編譯差不多,比較困難的是設定的部份,還有一個選項,必須在Shell>內選擇choose which shell is ...都選擇ash,不然會有問題,這部份應該是被設定為default shell
- 跟著我把所有toolchain內的libc/lib下的library跟link的檔案全部拷貝到<rootfs>/lib底下
另外兩個重要的設定檔案內容如下inittab
第二行得加上去,如果部加上去的話你會看不到login shell,其他詳細的設定方式可以參考"建構嵌入式linux系統"一書
接著是/etc/rcS,這部份是借用了原來板子上的檔案,可是hotplug一直有問題,我直接把那行/bin/hotplug註解掉了,可是還是有點小問題
最後在用光碟內的工具用mkyaffs2image-128M _install yaffs_root.img,然後就可以下載到板子上
rootfs已經成功刷上去沒有問題,但是目前新編譯的kernel有問題~苦惱中,難道一個嵌入式系統就是編譯debug嗎:P
最後建議要刷板子的人先把nand flash的內容備份下來吧,雖然我覺得他好像有問題(不知道是賣我的人給我二手貨,還是出廠軟體就有問題)
2012年3月12日 星期一
2012年2月12日 星期日
吃盡苦頭編譯busybox(2)
了解了一些開機流程之後,大概知道要補足那些東西了,進入_install目錄,開始建立缺乏的目錄跟檔案
mkdir etc dev tmp proc sys
跟著在etc底下在建立init.d,新增檔案etc/init.d/rcS,內容是
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s
/bin/sh
把rcS加上可執行權限
chmod +x rcS
接著把busybox連結到_install\init,你可以看到_install底下有linuxrc,這是2.4的名稱,在2.6之後使用init
ln -s bin/busybox init
接下來進入/dev底下建立裝置,必須用root權限
mknod console c 5 1
mkdir etc dev tmp proc sys
跟著在etc底下在建立init.d,新增檔案etc/init.d/rcS,內容是
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s
/bin/sh
把rcS加上可執行權限
chmod +x rcS
接著把busybox連結到_install\init,你可以看到_install底下有linuxrc,這是2.4的名稱,在2.6之後使用init
ln -s bin/busybox init
接下來進入/dev底下建立裝置,必須用root權限
mknod console c 5 1
mknod null c 1 3
還有補上etc/inittab,內容是
::sysinit:/etc/init.d/rcS
這樣就都完成了,重新打包image吧
find . | cpio -o --format=newc > ../rootfs.img
回到busybox目錄,使用qemu測試
qemu-system-arm -kernel zImage -initrd rootfs.img
後話:這裡我都沒有把image做壓縮的動作,因為測試方便,如果要放上去,壓縮一下可以節省空間,另外裡面還有個小小的錯誤,我想以後再說吧:P
2012年2月11日 星期六
開機流程
bootloader在載入kernel之後,kernel會連帶載入initrd,也就是busybox打包起來的image檔案,理由在於kernel為了精簡,他只處哩cpu排程、記憶體管理...等重要功能,並沒有root file system,且沒有drivers的部分,driver的捨棄是因為全部包起來太過龐大了,所以把這部分委託給另外一個initrd去建立一個虛擬的root file system,並且載入記憶體當作root file system,這樣就可以順利把drivers載入了
bootloader把initrd載入記憶體後,kernel就排程,並且安排initrd中的一個init的行程去工作,init主要就是呼叫一個scripts(/etc/init.d/rcS),把其他工作完成,然後接手許多工作,底下是script大致紹的工作
可以用之前的busybox觀察,因為只有建立一個shell,先用ls觀察,發現目錄少的可憐,也因為沒執行script,所以上面列出的功能都沒有做,當使用ps指令的時候,系統會抱怨找不到/proc,/proc的意思是process file system,原意是用來儲存process資訊的地方,使用手動指令把掛載起來
mkdir /proc
mount -t proc none /proc
bootloader把initrd載入記憶體後,kernel就排程,並且安排initrd中的一個init的行程去工作,init主要就是呼叫一個scripts(/etc/init.d/rcS),把其他工作完成,然後接手許多工作,底下是script大致紹的工作
- 建立/proc跟/sys
- 建立必要的/dev裝置,可以看到有許多mknod指令,乃至於hotplug
- 載入drivers,會看到一堆insmod xxx.ko
- 真的引入linux的file system
- 一些類似網路設定等等也可以寫死在這裡
可以用之前的busybox觀察,因為只有建立一個shell,先用ls觀察,發現目錄少的可憐,也因為沒執行script,所以上面列出的功能都沒有做,當使用ps指令的時候,系統會抱怨找不到/proc,/proc的意思是process file system,原意是用來儲存process資訊的地方,使用手動指令把掛載起來
mkdir /proc
mount -t proc none /proc
這時候在執行ps,就可以看到畫面了,kernel就不會再抱怨找不到這個file system
其實使用/proc的人都知道,裡面其實還可以找到很多裝置的資訊,乃至於其他有用資訊,本來單純的process file system也變複雜
為此Linus決定在2.6引入另外一個/sys目錄,意思是system file system來儲存其他有用資訊,這個目錄會用來重新整理一些有用的資訊如/sys/block用來儲存區塊裝置,如硬碟的資料,/sys/bus則用來找尋硬體裝置,使得hotplug功能更容易實踐。
所以掛載/sys也是必須的
mkdir /sys
mount -t sys none /sys
其實還缺少了不少東西
/dev這個重要目錄,它是用來儲存裝置資訊了
/etc這個設定檔案的目錄,且重要的/etc/init.d/rcS這個script檔案就是放在這裡啊
/etc/inittab這個filesystme的分割紀錄檔案
/tmp暫存目錄
吃盡苦頭編譯busybox(1)
小小的設定錯誤跟失誤讓人吃進苦頭orz
首先下載去下載busybox,真著把tarball解開後,進入目錄
make ARCH=arm CROSS_COMPILE=arm-linux- defconfig
首先下載去下載busybox,真著把tarball解開後,進入目錄
make ARCH=arm CROSS_COMPILE=arm-linux- defconfig
這指令會載入default config,跟著自行定義需要的config
make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
我在menuconfig內只有多選了一個選項就是,把busybox打包成static library,這樣以後就不用考被一堆library了
[插曲]
因為兩個失誤害我編譯了好幾個小時跟做了好多測試
1. 把CROSS_COMPILE打成CROSS_COMPILER,make完全沒有抱怨,只是把它當成額外的巨集定義orz,測試了好久,qemu都跟我說init不能執行,因為x86的指令不能跑在arm上面阿~囧,隔了幾個小時才注意到
2. 在建立toolchain的時候沒有編譯large file support,這個會造成錯誤,我只好從新編譯toolchain,又花了好久的時間:P
跟著下
make ARCH=arm CROSS_COMPILE=arm-linux- install
這樣開始編譯,並且編譯完畢的檔案會被放到一個名為_install的目錄底下,可以注意到,指令只有差了後面參數的defconfig=>menuconfig=>install。另外一個有意思的觀察可以進入_install,然後下ls -la,可以發現所有的指令都是link到busybox這個檔案
接下進入_install目錄來打包一下root file system,用qemu測試能不能用,免得犯了跟我一樣的錯誤
find . | cpio -o --format=newc > ../rootfs.img
然後回到上一層目錄,把上次拷貝的zImage那個kernel拷貝過來,執行
qemu-system-arm -kernel zImage -initrd rootfs.img -append "root=/dev/ram rdinit=/bin/sh"
最後參數的意思是把init用/bin/sh取代,所以開機就會去執行/bin/sh,這時候應該會看到類似下面的畫面
參考資料
http://balau82.wordpress.com/2010/03/27/busybox-for-arm-on-qemu/
http://balau82.wordpress.com/2010/03/27/busybox-for-arm-on-qemu/
訂閱:
文章 (Atom)