2007-01-11

基本環境的設定 - ipkg & post-boot

上一篇裡完成了 USB 磁碟區的分割,也手動地設定了 swap 和 mount 磁碟機,可是只要一重開機 (reboot),剛剛的設定就會消失。所以接下來要做的,就是更改一些基本環境的設定,並且安裝一些工具以便未來的編輯和操作。

首先,我們想要編寫一些設定檔,那就需要文書編輯器。如果你不習慣用 vi ,那就要安裝一套類似 BBS 的整頁編輯器才行。要安裝軟體,總不可能還要自己抓原始碼來編譯,而且未來的安裝使用一定也是要存在 USB 的磁碟區,所以接下來就要去設定安裝軟體的環境。韌體支援所謂的 ipkg 軟體安裝管理系統,類似 Redhat 的 rpm,讓裝軟體和用 windows 的新增移除軟體一樣容易。接續上篇,如果沒有重開機,就可以直接使用已經 mount 的目錄 /opt 來安裝設定,否則,請在手動把 USB 磁碟區 mount 起來。

mount /dev/scsi/host0/bus0/target0/lun0/part1 /opt

然後建立暫存目錄,並設定 ipkg (v0.99) 環境:

mkdir /opt/tmp
mkdir /opt/tmp/ipkg
ipkg.sh update
ipkg.sh install ipkg

更新 ipkg 的 package list:

/opt/bin/ipkg update

這樣就完成了你的 ipkg 環境。如果想定期更新 package list,上面的命令可以定期使用(該命令的其他參數未來也會常用到)。想知道現在線上有哪些新版的程式可以安裝嗎?用下面的命令:

/opt/bin/ipkg list

那以後該怎麼安裝軟體呢?好,先拿大大們推薦程式又小又好用的全頁文書編輯器 nano (v1.2.5,會一併安裝 ncurses v5.5) 來裝裝看,就可以瞭解安裝軟體多麼容易。

/opt/bin/ipkg install nano

一瞬間就裝好了。如果你想知道系統裡現在裝了什麼東西,就像是 windows 的「新增移除程式」一樣,你可以執行下列命令,列出系統已安裝的程式有哪些:

/opt/bin/ipkg list_installed

移除反安裝是:

/opt/bin/ipkg remove nano

接下來你可以直接用 nano 這個命令開啟編輯器來編輯檔案囉(聽說如果安裝中看到 "Segmentation fault" 的錯誤訊息,上面那行安裝的命令再執行一次就好,不過我沒碰過)!好了,有文書編輯器,那就可以用來編輯設定檔囉!Oleg 的韌體裡在開機過程會去執行一個檔案(如果存在的話):/usr/local/sbin/post-boot,接下來要做的就是把上一篇裡 mount 磁碟機和 swap 的命令放進這個開機檔裡,讓你的 ADSL router 一開機會自動 mount USB 上面的磁碟區。首先,建立目錄(如果下面的兩個目錄都存在就可以略過):

mkdir /usr/local
mkdir /usr/local/sbin

然後建立檔案並設定檔案屬性(都是執行檔):

touch /usr/local/sbin/post-boot
touch /usr/local/sbin/post-firewall
chmod +x /usr/local/sbin/*

post-firewall 這個檔案顧名思義和防火牆有關,以後會用到,所以在這邊一併產生。檔案都產生以後,馬上拿剛剛安裝的那個編輯器 nano 來編輯開機執行檔:

/opt/bin/nano /usr/local/sbin/post-boot

在編輯器裡,把以下內容貼進去:

#!/bin/sh
# wait for /opt to mount
mount /dev/scsi/host0/bus0/target0/lun0/part1 /opt
i=0
while [ $i -le 30 ]
do
if [ -d /opt/etc ]
then
break
fi
sleep 1
i=`expr $i + 1`
done

# Activate swap
swapon /dev/scsi/host0/bus0/target0/lun0/part2

# Run all active services - active means starts with S
/opt/etc/init.d/rc.unslung

可以看到的是 swapon 和 mount 指令都在裡面,然後用 ctrl+o 存檔,ctrl+x 離開 nano,這樣你的設定檔就改好了。最後一行要你開完機後去執行一個執行檔:/opt/etc/init.d/rc.unslung,作用是開機時會自動去該目錄執行所有 S 開頭的服務啟動程式,以後只要安裝任何服務,把啟動檔改成 S 開頭的檔名放到 /opt/etc/init.d/ 目錄下,開機後就會幫你自動啟動。因此要手動建立這個檔案:

nano /opt/etc/init.d/rc.unslung

貼入以下的內容:

for i in /opt/etc/init.d/S??* ;do

# Ignore dangling symlinks (if any).
[ ! -f "$i" ] && continue

case "$i" in
*.sh)
# Source shell script for speed.
(
trap - INT QUIT TSTP
set start
. $i
)
;;
*)
# No sh extension, so fork subprocess.
$i start
;;
esac

done

一樣記得存檔後離開,然後更改該檔案的屬性:

chmod +x /opt/etc/init.d/rc.unslung

不要急著重開機,請注意設定檔 /usr/local/sbin/post-boot 並不是在 /opt USB 磁碟區裡,而是存在 router 的 flash 中,如果你沒有要求將改變寫入 flash 裡,重新開機以後剛剛做的設定檔就不見了!所以要執行下面的命令,要求更新 flash 的內容,才能把上面做過的事情保留在 flash 中,以後重開才不會消失。

flashfs save
flashfs commit
flashfs enable

完成之後就可以重新開機 (reboot) 檢查看看,用 du 和 free 兩個命令檢查重開完 swap 和 /opt 磁碟區有沒有被 mount 起來,如果有那就成功啦!

參考文章:(和上一篇一樣)
ipkg package system Tutorial
[HowTo] Getting started (Firmware upgr, Storage, Samba, SSH)

回應: 15

Unknown 提到...

今天總算開始『改造』我的WL500G,執行至此,由於我對LINUX是道地門外漢,照本宣科之下仍然有很多不懂,還望Abin兄海涵與指導,遇到問題有2:
1. 在第一篇中,執行KILLALL STUPID-FTPD,會顯示『killall: stupid-ftpd: no process killed』,是否我的stupid-ftpd正常下未啟用?另外請教如何看出我的WL500G已執行哪些服務?
2. 使用Nano編輯時,無法看到內容,我是用WINDOWS的"超級終端機"和"命令視窗",均無法看到內容進行編輯,只能看到下方2行COMMAND列,請問是否有其他編輯方法或需使用其他TELNET工具?

Abin 提到...

1. 很多情況下,STUPID-FTPD 不會跑起來,除非你用 Web 管理介面,去手動打開 FTP 服務,才會有這個服務跑起來,你看到的訊息的確是服務未啟用,沒跑起來也沒關係。至於你想知道有哪些服務在跑,可以用 "ps" 這個命令去看所有 process。
2. 我不大懂,你所謂"無法看到內容"是什麼意思?我是都用 Pietty 這個 telnet / ssh 工具,他支援完整的中文處理環境,您可以試試看。

匿名 提到...

請問:
您於上面文章提到『Oleg 的韌體裡在開機時會去執行一個檔案(如果存在的話):/usr/local/sbin/post-firewall』是不是因該改為『/usr/local/sbin/post-boot』?
是不是『/usr/local/sbin/post-boot』為系統開機後第一個會去執行的程式?而『/usr/local/sbin/post-firewall』是第二個?

非常感謝您的分享!

Abin 提到...

是的,應該是我打錯了,已修正,謝謝!
另外,我記得沒錯的話,應該是在 /usr/local/sbin/ 下面的執行檔在開機「完」都會被執行,post-boot 是一個進入點,而在 post-boot 的最後一行:/opt/etc/init.d/rc.unslung,它也是也有類似的作用,在 post-boot 被執行完,接著會去執行在 /opt/etc/init.d/ 下面所有的可執行檔。
因此,你會發現,後面文章安裝在 Flash 上的各種服務,啟動的程式都會被放到 /opt/etc/init.d/ 的目錄下,也是讓開機完自動執行起動用的。

匿名 提到...

ipkg.sh update 此命令连接的目标为什么不能连接?

想在WL500G上安装自己开发的应用软件,如何安装,需要用什么编译器来编译程序?谢谢!!!

Abin 提到...

使用命令 ipkg update 時會有 "Downloading 網址",請先確定你可以訪問該網址,我自己剛剛測試是正常的,並沒有連接不上的問題。

除了簡單的 shell 程式,我並不會開發上面跑的軟件。你可以使用 ipkg list,看看你能裝哪些開發工具 (C compiler, perl... ),再挑在上面你會用的語言在機器上開發。不可能在 PC (x86) 上開發程式編譯後然後在 WL-500g (MIPS) 上執行。

匿名 提到...

WL500G的交叉编译环境如何建立?紧用.谢谢!!!

isPeter 提到...

首先感謝 Abin 大大分享這麼精彩的文章,有了您的文章讓我改機的過程輕鬆許多。
我的機型是 WL500-gP
在您的文章有提到,當我把 "笨蛋FTPD" 在網頁停掉時,會導致 USB 碟無法 Loading。
我不確定這是因為機型的問題,還是我漏掉哪些步驟,所造成的問題。
當我的 Storage 無法掛進來時,我實在是不知道該怎樣繼續下去。
所以我嘗試將這問題找出來。

經過觀察 enable STUPID-FTPD 跟 disable STUPID-FTPD 的差別
我發現 disable STUPID-FTPD 時,USB 的某些 Driver 沒有 insert 進來 (用 lsmod 觀察)
當 USB Driver 不完整時,在 /dev 根本看不到 Device File (如 /dev/discs or /dev/scsi)
之後,我將三個 object 放在 post-boot 讓他開機時 Load 進來後,就一切正常。
這是我小小的心得分享,若有不盡完美之處,且多指教。

以下是我操作的步驟:

# Step 1

[admin@(none) /]$ vi /usr/local/sbin/post-boot

# Step 2

# insmod USB Driver(add this line if you disable STUPID-FTPD)
insmod /lib/modules/2.4.20/kernel/drivers/scsi/scsi_mod.o
insmod /lib/modules/2.4.20/kernel/drivers/scsi/sd_mod.o
insmod /lib/modules/2.4.20/kernel/drivers/usb/storage/usb-storage.o

# Step 3

[admin@(none) /]$ flashfs save
[admin@(none) /]$ flashfs commit
[admin@(none) /]$ flashfs enable

Abin 提到...

To isPeter: 感謝感謝!我其實一直不知道為什麼停掉 FTP、導致 USB mount 不起來的原因,也不知道到如何解決,最好只好強迫啟動 FTP daemon,然後砍掉它。isPeter 兄提到手動 load USB library 的方法的確可以解決這個問題,讓 USB 和 FTP 不置於被綁死。

匿名 提到...

問題1.我在下mkdir,會回應mkdir: Cannot create directory ,我有哪裡做錯了嗎?為何無法create起來?
問題2.nano底下我按了crtl+o又會跳出依排command,是直接按下Enter就好嗎?
對不起一口氣問這麼多!!我是個門外漢,還請Abin大教導,謝謝!

Abin 提到...

To Ryan:
1. 回應 mkdir: Cannot create directory,代表建立目錄失敗,後面還有訊息嗎?通常,是該目錄已經存在,所以無法再建立目錄。
2. nano 的 ctrl+o 是存檔的意思,會跳出一排提示,是和你確認存檔的檔名有沒有改,如果確認存檔就按 enter,不然可以用 ctrl+c 取消存檔。

匿名 提到...

ipkg.sh install ipkg
ipkg.sh install ipkg-opt
哪一個才是正確的呢?

匿名 提到...

执行ipkg.sh update会在当前目录下生成lib目录,请问大大,你是在哪个目录下执行ipkg.sh update的,我觉得应该cd /opt/tmp/ipkg下执行。

Abin 提到...

沒指定目錄,代表在哪裡執行都可以。執行的指令和方法,就如同文章中寫的一樣。

Weijack 提到...

一點經驗分享:如果有手動將內網DHCP range改為非預設之192.168.1.0網段,重起之後將無法正確將usb partition 1 mount 至 /opt, 改回來即可,或許是個bug. 我是在數位天堂那裡看到一位網友的分享才知道的,在這裡借花獻佛希望有點幫助。

張貼留言

歡迎留言或發表意見,不過要理性不做人身攻擊。匿名的朋友得到回應的速度會比較慢喔~
發問相關的禮貌和規矩請先參考這篇文章,不當留言、和本文無關的回應可能會被直接刪除無視喔!