2007-01-30

增加 CGI/Perl 的支援能力 (microperl)

當 WL-500G 上的 Web Server 搞定了,需要在上面跑一些 CGI 程式嗎?或者是有一些 Perl 的執行檔 (.pl or .cgi) 想要使用?那就一定要在上面裝一套 Perl 的軟體以因應需求囉!在 ipkg 裡面有一套叫 microperl 的,是一套精簡核心的 Perl engine,足夠應付大部分的 CGI 和 Perl 的程式需求。

第一個步驟是安裝。如果你才更新過 ipkg 的 list,就不用再更新一次 (ipkg update),直接使用下面的安裝指令(此時我裝的是版本 5.8.6):

ipkg install microperl

基本上裝完這樣就可以執行手邊的 Perl 檔了。不過,Perl 最多的應用環境都是拿來當 CGI 使用,所以接下來要設定 Web Server,讓 Web Server 知道如何解譯 CGI 檔案。首先在 Web 首頁目錄下建立一個放 CGI/perl 程式的目錄,假設 Web 首頁目錄在 /opt/public/www,要建一個放 CGI 的目錄:

mkdir /opt/public/www/cgi-bin

接著要去 Web Server 設定檔。如果是用 thttpd,用 nano 開啟設定檔:

/opt/bin/nano /opt/etc/thttpd.conf

然後在最後一行加上就可以了:

cgipat=/cgi-bin/*

如果是用 lighttpd,很抱歉!這部分我還沒試過,所以沒辦法分享方法~(不過,是不是掛 FastCGI 就可以跑 CGI 了啊?)

不過如果此時 web server 已經在執行中,那除非除非重啟服務 (thttpd 執行 S80thttpd restart),要不就是整台重開 (reboot),CGI 在 WL-500g 上就可以搭配 Web Server 使用了!

參考文章:
ASUS WL-Series thttpd CGI / Perl guide

2007-01-25

動態調整文章字體大小

Blog 文章的字體大小,大多端看作者對版面和整體的要求,而讀者在看的時候,大多只能強迫接受,反正重點還是在內容上。如果自己眼睛不好、或是螢幕解析度太高,字體太大或太小(通常都是嫌字小吧)只好透過瀏覽器來調整(Ctrl + 滾輪,或是直接選較大的字型)。不過這麼做會有兩個問題:第一:整個頁面所有部分都會強迫被放大,包括 Sidebar、標題甚至留言版(字型可能變醜,而且版面會被破壞),第二:整頁可能要浪費時間強迫重新 Reload 一次。有沒有更簡單快速的方法,讓讀者可以只針對 Blog 本文的部分,來調整文字的大小,在閱讀的時候可以更輕鬆?

後來看見一篇 Blog 文章,用 Javascript 就可以輕鬆做到以上的效果,不過我又加以修改了一下,不用動到文章的架構和模版(就是說,不需要在內文多加 <span> 額外的標籤),也把函示兩個合併成一個,更加精簡、要套用在 Blogger 上面也更簡單,方法和步驟如下:

第一個步驟,把下面的 Javascript 插入模版 <head> 標籤的前面(或,只把函示部分插入自己模版的 Javascript 區段內):

<script type='text/javascript'>
function FontZoom(size)
{
  var element = document.getElementsByTagName("div");
  var components = new Array();
  for(i = 0, j = 0; i &lt; element.length; i++) {
    attribute = element[i].getAttribute("id");
    if(attribute == "main-wrapper") {
      components[j] = element[i];
      j++;
    }
  }
  for (i = 0; i &lt; components.length; i++)
    components[i].style.fontSize = size+'px';
}
</script>

從上面的程式碼來看,原理上呼叫這個函示時,它會去把整個檔案裡標籤是 <div>、屬性 id=main-wrapper 的元素抓出來,然後把該元素的字型大小設成指定的數字。這樣,就可以達到即時動態改變本文字體大小的需求了。(知道 main-wrapper 或下面的 header-wrapper 是什麼意思嗎?可以看我的這篇介紹:Template 的基本內容和結構

第二步驟,把下面的連結程式碼放入你想讓讀者使用的地方(不管是 Sidebar 或是標題區 header-wrapper 裡面都可以,隨自己高興放在版面順眼的地方):

<a href="javascript:FontZoom(16)">16</a>
<a href="javascript:FontZoom(14)">14</a>
<a href="javascript:FontZoom(12)">12</a>

程式碼裡面的 12, 14, 16 數字,代表的是想要改變的字體大小,可以自己做實驗,看看幾號字是你 Blog 本文預設用的大小,如果要給讀者使用,你也可以挑幾個自己覺得不會破壞頁面感覺的尺寸當作連結。(像我預設頁面字型大小是 13, 我放大用 16, 縮小用 11)

參考文章:
[Javascript]Selectable Post Font Size for your best view!

回應: 29

 

2007-01-23

支援 PHP 的網頁伺服器 (lighttpd + FastCGI) 安裝設定

實際我在 WL-500g 上跑 thttpd 的最大問題是:不穩,容易自己當掉,所以如果要在 WL-500g 上跑一個 Web Server 而且還支援 PHP 的,還可以用另外一種作法:lighttpd + FastCGI。顧名思義,lighttpd 是個羽量級的 httpd,與 Apache 之類服務不同的是,為了精簡核心、減少耗用資源,這個服務原生只支援靜態的 HTML 文件編譯,也因此實際的效能比其他相同的服務高上幾倍,而且耗用的資訊也很低,很適合 WL-500g 這類玩意來用。可是也因為只支援靜態文件,所以 PHP 的解譯需要其他外掛的服務模組搭配使用,而 lighttpd 上的 PHP 外掛服務就是 FastCGI,只要同時安裝、並啟動這兩個服務,就可以用最有效率的資源運用去支援 Web + PHP 的服務了。

首先,先安裝 lighttpd (v1.4.12, 關連套件 pcre v5.05 也會被一併安裝):

ipkg install lighttpd

裝完之後 lighttpd 就被叫起來了,不過有些設定還沒調整好,可以先停掉它晚點再呼叫:

/opt/etc/init.d/S80lighttpd stop

接下來安裝 php 的 CGI 模組:FastCGI (v5.1.6, include php, php-fcgi, php-gd, libgd v2.0.33, libjpeg v6b, fontconfig v2.3.2, expat v2.0.0, gconv-modules v2.2.5)

ipkg install php-fcgi

裝完,然後編輯 lighttpd 的設定檔:

nano /opt/etc/lighttpd/lighttpd.conf

主要裡面要改的,像是 port number、文件目錄、log 檔的目錄和檔名,當然,還有關於 php cgi 的設定(紅色是提示修改的部分,在 nano 編輯器裡可以用 Ctrl+W 去搜尋關鍵字修改):

## bind to port (default: 80) -> 改 port
server.port                = 8080
## server.virtual-* options -> 改 Web 檔案目錄
server.document-root       = "/opt/public/www/"
#### accesslog module -> 改 log 檔路徑檔名
accesslog.filename         = "/opt/var/log/lighttpd_access.log"
## where to send error-messages to
server.errorlog            = "/opt/var/log/lighttpd_error.log"
## modules to load -> 移掉下面這行前面的 '#',啟動 fastcgi 模組支援
"mod_fastcgi",
## deny access the file-extensions -> 下面這行加入 .sqlite 支援,可有可無
url.access-deny            = ( "~", ".inc",".sqlite" )
#### fastcgi module -> 打開 cgi 支援, 記得 host 改成自己執行的 host IP,port 不要動
fastcgi.server             = ( ".php" =>
                                ((
                                    "host" => "192.168.1.254",
                                    "port" => 1026,
                                ))
                             )

改好存檔離開(Ctrl+k+x)。從上面最後一段可以看出來,讓 lighttpd 能夠支援 PHP,是因為跑了另外一個專門處理 PHP 的服務,叫做 fastcgi.server,而且要使用內部的 Port 1026,這個獨立的服務,執行檔是 /opt/bin/php-fcgi。接下來,要把這個用來 Serve PHP 的 CGI 服務跑起來,並且讓每次開機都會自動執行,所以我們要手動做一個自動執行檔在 /opt/etc/init.d/ 下:

nano /opt/etc/init.d/S45php

檔案內容如下:

#!/bin/sh
export PHP_FCGI_CHILDREN=1
PORT=1026
BIN=/opt/bin/php-fcgi
#/opt/etc/php.d
case $1 in
 start)
  $BIN -b $PORT &
  ;;
 stop)
  kill Pidof phpM  ;;
 *)
  echo "usage: $0 (start|stop)"
  exit 1
esac

改完存檔,並且記得改檔案屬性為可執行:

chmod +x /opt/etc/init.d/S45php

接著,重啟 lighttpd 以及 FastCGI,就可以測試看看 Web 和 PHP 能不能運作囉:

/opt/etc/init.d/S80lighttpd start
/opt/etc/init.d/S45php start

至於怎麼測試 Web 和 PHP 正不正常、在設定檔裡面為什麼 Server Port 要改成 8080、還有服務跑起來以後,怎麼設定防火牆讓外面的人能連進來,請參閱我的上一篇文章,關於設定目錄、修改防火牆和測試的部分,和本文都可以通用。

參考文章:
lighttp and php tutorial

回應: 15

 

2007-01-22

支援 PHP 的網頁伺服器 (thttpd) 安裝設定

剛拿到 Asus WL-500g 的一定知道,它提供的是 Web 介面的設定方式,即使你用了 Oleg 的韌體,這個操作介面依然存在(還多了一些選項,只不過介面變英文的了)。言下之意是,不管怎樣韌體裡都一定有一個 Web Server (HTTP daemon)在跑,才能提供透過網頁介面來設定。可惜這個內建的 Web Server 相當陽春,而且是因為擔負著設定 Router 的重責大任,所以我們儘量不去動它,如果我們想拿這台 Router 來架一個可以對外服務的網站,而且最好還可以跑 PHP 網頁,那就要另外安裝一套囉!而且,在 Port 以及防火牆對外對內的設定也要調整,總不希望 Router 的設定介面會被人家從外面連進來 Config 吧!

這裡選擇的是 thttpd (Tiny/Turbo/Throttling HTTP server),因為的程式小、效能還不錯,而且還支援最新的 PHP5,安裝步驟也很簡單:

1. 安裝
在安裝程式之前,都要有個好習慣,就是先檢查軟體是不是有最新版:

/opt/bin/ipkg update

然後透過 ipkg 來安裝 thttpd (要花點時間下載、解壓縮和安裝):

/opt/bin/ipkg install php-thttpd

我裝的時候最新版是 2.25b,連帶它會下載安裝 PHP (5.1.6)、libxml2 (2.6.26)、libxslt (1.1.15)、 gdbm (1.8.3) 、libdb (4.2.52)、zlib (1.2.3),出現 "Successfully terminated" 就代表裝好了。(如果不行,確定網路可以連線,重新執行上面命令即可)

2. 設定
這個步驟分成兩個部分,第一個部分是你要指定你「網站」的目錄打算在哪裡,一併建立所需的目錄,第二個部分是 /opt/etc/thttpd.conf 設定檔內容。(兩部分是會有關係的)

2.1 建立目錄
網站目錄建議放在 USB 磁碟區裡 (/opt 下),假設我的網站目錄是在 /opt/public/www,手動建立:

mkdir /opt/public/
mkdir /opt/public/www

手動準備一個首頁檔 index.htm (測試使用,以後自己改掉):

echo "This is my test webspace!" > /opt/public/www/index.htm

檢查目錄 /opt/var 以及其子目錄 /opt/var/run, /opt/var/log 是否存在,這是用來存系統訊息和 log 的,不存在的話手動建立:

mkdir /opt/var
mkdir /opt/var/run
mkdir /opt/var/log

2.2 編輯設定檔
用 nano 去編輯修改設定檔 thttpd.conf:

/opt/bin/nano /opt/etc/thttpd.conf

加入或修改成以下內容:

dir=/opt/public/www
port=8080
user=nobody
nochroot
nosymlink
novhost
logfile=/opt/var/log/thttpd.log
pidfile=/opt/var/run/thttpd.pid

第一行是指定你網站的根目錄,而第二行是指定你 thttpd 要使用的 port,千萬不能改成 80,因為 80 已經被上述的「系統預設」網站程式給佔用,這裡如果設成 80 一定會出事的!所以我先用 Port 8080,當外面要連進來的時候透過防火牆將連線轉過來就好。設定好後存檔離開。

3. 防火牆設定
每次動到防火牆就是要動到 /usr/local/sbin/post-firewall 這個檔案。用 nano 開啟它,加入下面的設定內容。如果你有設定過 SSH,下面這段請加在 SSH 那一段之後,在最後一行之前:

# Port 8080 used for internal THTTP server, port 80 used for external access
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i $1 -p tcp --dport 80 -j DNAT --to-destination $4:8080

如果你沒有設定過 SSH,而且該檔案內容空白,請加下面完整的內容:

#!/bin/sh
iptables -D INPUT -j DROP

# Port 8080 used for internal THTTP server, port 80 used for external access
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i $1 -p tcp --dport 80 -j DNAT --to-destination $4:8080

iptables -A INPUT -j DROP

記得 flush 到 flash 裡再重新開機:

flashfs save
flashfs commit
flashfs enable
reboot

4. 測試
完成以上步驟後,Router 裡面應該跑了兩個 Web Server (可以用 ps 命令查一下),如果在家裡(內部區域網路,線路直接連接在 Router 後面),打開瀏覽器直接連會跑出預設 WL-500g 的設定頁面,如果在家裡要連剛裝好 thttpd 服務的網站,由於對內設定為 port 8080,所以要在 ip 或網址後面加上 :8080,假設你的 WL-500g IP 是 192.168.1.1,那麼新網站就會是 http://192.168.1.1:8080。如果你從外面連,由於對外我們是使用 port 80(防火牆將外面連進 Port 80 的連線都轉到內部的 Port 8080),所以直接使用固定 IP 或你申請的網域名稱應該就可以連了。剛剛我們放的測試首頁裡只有一行,所以如果正常的話,應該只會看到一行 "This is my test webspace!" 才是。

如果你想測試 PHP 取得各個版本和支援的資訊,可以再建立一個檔案:

echo "<?php phpinfo(); ?>" > /opt/public/www/index.php

這個檔案裡面是 PHP 的程式碼,如果 Web Server 正常執行,那麼除了會有完整的 PHP 相關訊息,也會有版本資料提供參考。

如果怎麼連都連不上,請確定該程式有在執行中(可以用 ps 指令,檢查有沒有 /opt/sbin/thttpd -C /opt/etc/thttpd.conf 這個執行緒在)。如果沒在執行,也可以手動啟動該服務,只要執行下面命令該服務也會跑起來:

/opt/etc/init.d/S80thttpd start

同樣的,如果你後面 start 的參數改成 stop 或是 restart,也可以對正在執行的 thttpd 做停止和重新啟動的操作。

參考文章:
thttpd Web Server

備註:
我比較喜歡像 thttpd 這種 Web Server + PHP 的服務,但是我自己用的感覺一直都不穩,偶爾 Daemon 莫名其妙就死掉消失,網路上有類似反應的人好像還不少。如果裝完 thttpd 而且實際上也不大穩的話,也可以換別套使用。(下一篇介紹改用的是 lighttpd + FastCGI,兩個裝在一起也能同時提供 Web + PHP 的服務)

回應: 1

 

2007-01-17

網路芳鄰 (Samba) 的設定

只要安裝啟動 Samba 服務,就可以把 Router 上面的特定目錄或分割區透過網路芳鄰與其他電腦共享,如果你在 Asus WL-500g 上面 USB 接的是大容量的 Flash 甚至是硬碟機,那麼透過這個服務就可以讓你的 Router 變成一台檔案伺服器或是 NAS 囉!在檔案存取及分享上能夠變得更方便!

Samba 服務因為如此重要,已經被 Oleg 大大內嵌放入韌體裡面了,我們不用安裝,只要負責設定和啟動它,它就可以運作了。(不過說實話,分享存取小檔沒問題,但是如果用來分享影像音樂等大一點的檔案,因為 WL-500g 的 USB 只有 V1.1,速度很慢,加上 Samba 的效率也比較差,所以拿來做大檔分享可能會很慢)

首先我們要先建立 Samba 的設定檔。我們在 /opt/etc 下面建立存放 Samba 設定檔的目錄:

mkdir /opt/etc/samba

建立並編輯設定檔 smb.conf:

nano /opt/etc/samba/smb.conf

貼入以下內容:

[global]
workgroup = Workgroup
guest account = nobody
security = share
browseable = yes
guest ok = yes
guest only = no
log level = 1
max log size = 100
encrypt passwords = yes
dns proxy = no

[Share]
path=/opt/public
writeable = yes
browseable = yes

這個設定檔的內容要依據個人的環境和需求來調整。像是在 [global] 這個 Section 裡面, workgroup= 是指定你的 Router 是屬於那個工作群組,Windows 環境如果沒有改過的話,群組名稱預設都是 "Workgroup",而下面 [Share] 的 Section 就是看你想要分享那個目錄出來,分享的名稱還有該目錄的存取權限。以上面的例子來說,我分享了我在 /opt/public 目錄出來,可以讀寫,而且使用者看到我分享的目錄名稱為 "Share",如果你想多分享幾個目錄出來,你就手動多加幾個 [Share2] [Share3] 之類的 Section 就行了,當然名稱可以自訂。

接下來的問題是每次開機都要啟動 Samba 這個服務,才能讓網路上的電腦存取你分享的目錄。Samba 服務包含了兩個 Daemon 程式:smbd (主程式) & nmbd (負責名稱解析的),還記得一開始我們在產生 post-boot 時的最後一行: /opt/etc/init.d/rc.unslung,這個執行檔的目的就是幫忙啟動你放置在 /opt/etc/init.d/ (USB 磁碟區)裡面的服務和程式,這樣我們有裝新東西就不用都要去改 post-boot 囉!因此像這次我們要同時啟動 smbd & nmbd,我們只要寫一個批次檔放在 /opt/etc/init.d/ 目錄下,開機的時候不也會順道執行嗎?建立並編輯這個批次檔:

nano /opt/etc/init.d/S97Samba

並且加入以下內容:

#!/bin/sh
/usr/sbin/smbd -D -l /opt/var/log/smbd.log -s /opt/etc/samba/smb.conf
/usr/sbin/nmbd -D -n WL500g -o -l /tmp -s /opt/etc/samba/smb.conf

請注意 nmbd 後面那個參數 "-n",照參數說明應該是 Netbios 的名稱,通常這個名字和「主機名稱」應該都是一樣的,如果你曾經改過你 WL500g 的 Hostname「主機名稱」(預設是空白,你可以用命令 hostname 來看現在的主機名稱為何),建議 -n 後面帶的名稱和你的主機名稱一樣(你也可以用命令 "hostname WL500g" 把你的主機名稱改成 "WL500g"),這樣可以避免發生一些錯誤(像是 cant get hostname by address 之類的)。存檔離開後記得更改檔案屬性。讓它變成一個可執行檔:

chmod 755 /opt/etc/init.d/S97Samba

這樣所有的設定動作就完成了!你可以重新開機,或是執行 /opt/etc/init.d/S97Samba,用 ps 看看 smbd & nmbd 這兩個程式有沒有跑起來,有啟動就成功啦!接下來用電腦查看網路芳鄰,在同一個工作群組 (Workgroup) 下的話就可以看到 WL-500g 這台「主機」,裡面有分享上面你指定分享的目錄,這樣存取和檔案分享就可以很方便囉!

參考文章:
SAMBA Tutorial
[HowTo] Getting started (Firmware upgr, Storage, Samba, SSH)
鳥哥的 Linux 私房菜 - SAMBA 伺服器

回應: 9

 

2007-01-15

新增使用者群組及修改Shell啟動文件

裝置預設只有一組帳號和密碼 (admin),而且是具有管理者權限的,如果今天你只是透過 WL500g 來操作,並不會動到系統,那麼總是用 admin 登入好像不太好。但是很不幸的,Oleg 大大為了系統穩定,他的韌體裡面附的 busybox 並不支援 adduser、addgroup 等帳號群組操作的命令,這些動作只好自己來。不過稍有 Linux 概念的大概都知道,帳號群組主要就是搞 /etc/passwd 和 /etc/group 兩個檔案,我們要做的就是在裡面加記錄、設定使用者密碼,並且更新到 flash 裡面。

首先新增使用者。編輯帳號設定檔 /etc/passwd:

nano /etc/passwd

在最後一行加入新增使用者的紀錄。假設這個使用者叫 user1,使用者 ID 1001,群組 ID 1001,使用者目錄在 /opt/user/user1 下面(內容都可以改),設定的紀錄為:

user1:x:1001:1001:user:/opt/user/user1:/bin/sh

存檔離開後,接者編輯群組設定檔 /etc/group

nano /etc/group

在最後一行加入新增群組的紀錄。上面提到的新群組 ID 為 1001,因此新增的的紀錄為:

user:x:1001:

接下來設定新使用者的密碼:

passwd user1

設定好之後記得處理目錄和權限的問題。以上面的紀錄為例,這個新的使用者 user1 的根目錄是在 /opt/user/user1 下面,假設以後新增的使用者都屬於"user"群組,根目錄都會在 /opt/user 的下面,因此我們需要在 /opt 下面建立一個屬於群組 "user" 的目錄,然後在這個目錄下建立使用者的目錄,並且用 chgrp & chown 來設定目錄與使用者和群組的使用權限:

mkdir /opt/user
mkdir /opt/user/user1
chgrp -R user /opt/user
chown -R user1 /opt/user/user1

對即將登入的新使用者來說,有些系統的登入訊息、PATH 設定和執行檔別名(alias)可以透過統一的 Shell 啟動文件來幫使用者設定預設值,像是大家習慣用的 dir 只有在 dos 環境上有,管理者可以透過啟動文件替使用者預先建立類似 dir = ls 的別名,或放入要給使用者看的訊息,這樣不管你新增幾個使用者在登入時都可以套用同一份設定。預設系統有一份啟動文件,檔案和密碼群組設定檔放在同一個目錄,我們可以先編輯它:

nano /etc/profile

我主要只是更改了 PROMPT 的提示符號,並且增加我自己常用的一些命令的 alias,有興趣可以參考:

export PS1="\u@\h[\w]:"
alias ls="ls --color=auto"
alias cls="clear"
alias dir="ls -al"
alias flush="flashfs save; flashfs commit; flashfs enable"
alias ftp="ncftp"
alias lo="exit"
alias md="mkdir"
alias rd="rmdir"

如果要建立特定使用者用的 alias,可以在使用者目錄下建立一個 .profile,裡面放入該使用者專用的設定。當帳號、群組、目錄和請動文件都設定好了,最後一個步驟就是寫入 flash。由於 /etc/passwd 和 /etc/group 這兩個檔案是很重要的系統檔,在 flush flash 時也希望能一併被備份起來,所以我們要多做一個動作:

echo "/etc/passwd" >>/usr/local/.files
echo "/etc/group" >>/usr/local/.files
echo "/etc/profile" >>/usr/local/.files

產生的 .files 會提醒當在做「設定檔備份」的時候,會一併備份上面幾個檔案,確保使用者資料不會遺失。接下來就要更新 flash 囉(可以注意一下,執行到 flashfs save 命令時會多備份到 /usr/local/.files):

flashfs save
flashfs commit
flashfs enable

(以上的三個命令也可以用我建立的 alias: flush 一併執行~偷懶用..)這時候系統已經生效了,新使用者應該就可以登入囉!不過如果使用者要改密碼,和管理者 admin 要改密碼一樣,一定要更新寫入 flash,這樣你的機器重開後新密碼才會保存下來。

回應: 4

 

2007-01-12

SSH 的設定和啟用

之前都是用 telnet 連進 router 做設定,但這是一種很不安全的連線方式,容易被監聽竊取帳號密碼,所以我們要另外跑一個安全的連線服務:SSH (Secure Shell)。Windows PC 端的連線程式 (SSH client) 可以找這裡 ,或是 piaip 開發中文版的 PieTTY

其實在 Oleg 的韌體裡已經有 SSH Server 在裡面,程式名稱叫 dropbear (丟熊?),要啟動該服務要做的事情有三件:1. 設定 dropbear 的 SSH 連線金鑰,2. 要求每次開機這個服務自動啟動,3.在防火牆上打洞讓你可以從外面連進來。接下來我們根據以上的步驟依序來進行設定。

1. 金鑰設定
首先,我們要先建立存放金鑰的目錄。Oleg 的韌體要求預設目錄在 /usr/local/etc/dropbear,所以我們手動建立目錄:

mkdir -p /usr/local/etc/dropbear

接下來要求產生 key pair (DSS & RSA),要多花一點點時間等待:

dropbearkey -t dss -f /usr/local/etc/dropbear/dropbear_dss_host_key
dropbearkey -t rsa -f /usr/local/etc/dropbear/dropbear_rsa_host_key

2. 開機自動啟動
還記得上一篇我們為了一開機時就自動 mount 磁碟機所產生的 /usr/local/sbin/post-boot 嗎?要 SSH 一開機啟動只要在這個檔案裡加兩行就行了。先用 nano 開啟這個檔案以便編輯:

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

然後在最後面加入下面兩行:

# Start SSH daemon
dropbear

ctrl+o 存檔然後 ctrl+x 離開就行了。

3. 防火牆設定
如果你有固定 IP 或網址,需要從外面連你的 router 進行設定才需要進行這個步驟,如果不開防火牆設定,你的 SSH 服務就只能在家裡面使用(外面連不進來)。同樣的還記得上一篇有提到,我們在建立 post-boot 時順道做了一個 post-firewall?這時候就派上用場了。同樣地用 nano 開啟檔案:

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

然後加入下面的內容在檔案裡(裡面應該是空白的):

#!/bin/sh
iptables -D INPUT -j DROP

# Port 22 used for SSH server
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t nat -A PREROUTING -i $1 -p tcp --dport 22 -j DNAT --to-destination $4:22
iptables -A INPUT -j DROP

上面幾行的意思,就是要機器對外的 Port 22 打開,連線進來的時候轉向到機器本機的 Port 22。一樣使用 ctrl+o 存檔然後 ctrl+x 離開就行了。

別忘了,因為我們是動到 /usr 下面的檔案,都是存在 flash 裡面的,如果沒有去 save & commit 結果,重新開機就會消失喔!所以還是要要求寫入 flash:

flashfs save
flashfs commit
flashfs enable

完成之後就可以重新開機 (reboot) ,然後就用 SSH Client 程式從家裡或是外面連進來試試看能不能成功囉!(重開完,用 ps 這個命令應該會看到有 dropbear 這個 process 在跑才是)

參考文章:
Olegs firmware SSH Server guide
[HowTo] Getting started (Firmware upgr, Storage, Samba, SSH)

回應: 14

 

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

 

Wl-500g 韌體更新和磁碟分割

改機的第一個步驟一定是先改掉原廠的 firmware。首先去下載 Oleg 大大改出來的韌體:http://oleg.wl500g.info/ ,最後我使用的是 1.9.2.7-7g, 下載的是給 WL500g 用的韌體檔。解壓縮後裡面有個附檔名 .trx 的檔案,這才是更新時所需要的檔案。一般這類的裝置都有提供更新韌體的介面,Asus WL500g 提供網頁來更新韌體,進到管理頁面後選系統設定 (System Setup) -> 韌體更新 (Firmware Upgrade),這個頁面你也可以看到目前韌體的版本資訊,瀏覽 (Browse) 本地端的檔案,選擇你剛剛解壓縮的 .trx 檔,靜待幾分鐘韌體就更新完了。如果你換了韌體後想換回來,只要去華碩的網站下載,就可以恢復原來的狀況。我最後看到華碩釋出的韌體版本是 1.9.5.0,繁體中文版可以在這裡下載。

更新完畢重新開機原有 Asus 提供的網頁設定介面仍然存在,操作方法也和原廠韌體大同小異,而且,別擔心全部設定都消失要重設,因為核心原始碼是同一個,只不過多了一些說明書上沒有的功能,原有上面的設定(撥接方式、IP、密碼..)都會保留。Oleg 大大好像是俄羅斯人,不要奢望這樣的網頁介面會有中文,除非哪天有人無聊把那些網頁字串都中文化才有可能。

這時候你一定會很興奮地去試一些透過網頁介面就可以設定的功能(像是 FTP、Samba),我建議最好這些功能都先用網頁去關掉(除非你的改機步驟到此為止),因為後面有些步驟我們會重新設定 samba,安裝 vsftpd,有些軟體和設定會比網頁能做的更穩定或更有彈性,這裡先不要急著去打開這些功能,好處我們後面會提到。除了網頁有提供幾個新功能外,重點是,現在我們可以用 telnet 登入 WL500g 囉!用和網頁介面相同的 IP 和帳號密碼 telnet 登入,稍微有 linux 經驗的可以翻弄一下目錄,檔案結構和命令很多都和 linux 一樣,但是由於核心和 CPU 和一般 PC 跑的 linux 有很大的差異,加上你看到的檔案目錄其實都是在 firmware 所在的 flash 裡面,功能和空間都很有限,而且機器重開後所有變更都會消失。如果想在上面安裝軟體或是變更設定,一定需要額外的儲存媒介和強制更新 flash 的動作。

額外的儲存媒介當然只能透過那個 USB 介面,WL500g 不像 WL500g Deluxe 有兩個 port,所以透過唯一的 USB port 來裝硬碟或是大姆哥之類的 flash 記憶卡以後就不能再玩什麼 USB 印表機或 Webcam 囉!WL500g 的 USB 還是 1.1 的,所以如果拿來接 USB2.0 大硬碟或進行大量的檔案存取就不必了,這裡建議拿一條用不大到的 128 or 256MB 記憶卡來插就夠了,如果是用 Deluxe 的 USB2.0 介面,那就可以玩大容量硬碟空間來做檔案分享。

內建的韌體 USB 儲存空間是用來玩 FTP 用的,所以一插入 USB 儲存裝置它會自動幫你 mount 起來 (mount 到 /tmp/harddisk,裝置名稱 /dev/scsi/host0/bus0/target0/lun0/part1,如果這台硬碟有其他分區,就會有其他 index 的名稱出現 ),並且啟動內建的 FTP 伺服器(笨蛋 FTPD: stupid-ftpd),所以如果要設定你的儲存裝置,要先砍掉這個服務,才能 un-mount 這個硬碟(不然儲存空間會因為正被服務使用中,無法 unmount)。如果你的 USB 插進去發現沒有反應,可以進到設定網頁去 Eject 退出 USB 重插一次,或是直接打開 FTP Server,這些動作會強迫系統去檢查是否有 USB 裝置插入,並且自動去 mount。

killall stupid-ftpd
umount /tmp/harddisk

一般的記憶卡或硬碟插上去之前應該都已經格式化過了,一般上面的檔案系統不外乎是 FAT、FAT32 甚至是 NTFS,如果你的儲存設備就是專門要給 WL500g 用的,沒有其他考量的話不管容量大小強烈建議重新規劃,把檔案系統改成 linux 專用的 ext3。雖然 guides 上面說除了 NTFS 不支援外,原有的 FAT 和 FAT32應該都可以直接用,但是我實際試過的經驗是即使是 FAT,我跑 samba 的時候用網路芳鄰要寫入檔案,不管怎樣寫入動作都會失敗(和權限沒關係,因為同樣的設定我在換成 ext3 的檔案系統就好了),為求順利改成專用的 ext3 檔案系統比較保險,也可以處理大硬碟的問題。用 fdisk 來做 partition 的動作。

fdisk /dev/discs/disc0/disc

接下來刪除 (d) 原有的 partition,新建立 (n) 一個 primary partition (p),代號是第一個 (1),指定拿來做主要空間,假設保留 210MB,起始位址用預設值(直接按 Enter),結束位址或空間大小就敲 +210M。預設會用 ext3 檔案系統 ID: 83。

再來指定剩下的空間當作 swap (n) (p) (2),起始和結束位址都用預設值(用掉剩下的空間,按兩次 enter),指定 (t) 這第二個分割 (2) 的檔案系統是 swap (82),寫入磁碟分割的變更設定並且離開 (w)。以上 ( ) 內的指令都是在 fdisk 過程中要下的命令和選擇。可以用 fisk -l 來看剛剛規劃分割區的結果。(最好是第一個當主要空間,第二個當 swap,好像只有如此,重新開機後才不會多 mount 一次 USB 磁碟,FTP 的 servive 也才會自動關閉)

fdisk -l

結果裡會有最新的 Device ID,像是 /dev/scsi/host0/bus0/target0/lun0/part1,主要的磁碟區,以及 /dev/discs/disc0/part2,剛剛分割的 swap,接下來要分別製作 swap (mkswap) 和格式化 (make fs)。

mke2fs -j /dev/scsi/host0/bus0/target0/lun0/part1
mkswap /dev/scsi/host0/bus0/target0/lun0/part2

兩個步驟都一定要做到完,回到提示符號才算成功。和一般分隔硬碟磁區一樣,格式化完要重新開機才會生效

reboot

重開完要先手動把這兩個新建的磁碟區給啟動和 mount 起來,這裡我們把主要的磁碟區 mount 到 /opt 這個目錄:

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

好!步驟到這裡你的 WL500g 就有了一個額外獨立的磁碟機,可以用來安裝軟體、儲存設定,甚至拿來分享檔案和架站。檢查一下這兩個新的分割的狀況吧!可以用 free 這個指令觀看 swap 和記憶體的使用情況,用 df 可以看磁碟機的使用和剩餘空間。

有了專用的磁碟機,我們接下來才能做幾個重要的初始設定動作:
1. 設定安裝軟體的環境 (ipkg)
2. 先來裝個好用的編輯器,等等拿來編輯設定檔比較方便
3. 編輯系統檔,讓每次開機都會自動 mount 剛剛新增的磁碟機

(接下篇的初始環境設定,先不要重新開機 reboot 囉!)

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

回應: 15

 

2007-01-04

更改 HTML 首頁檔頭資訊 (head-content)

在 HTML 檔裡面大部分的標籤,都是用來格式化顯示在頁面上的內容,但是有些資訊,也許和網站或檔案本身有關,並不一定會都顯示在畫面上,針對這些 metadata 的內容,通常會被塞在 <body> 標籤的前面,或是塞在 <head> </head> 標籤的裡面,這些通稱它們叫檔頭資訊(不是"擋頭")。這些資訊早期只有註記的功能,像是該網頁檔案是那個 HTML 編輯器產生的、作者是誰,後來,配合瀏覽器的支援,這些資訊對讀者瀏覽這些檔案的時候就會有不同和功能,最常見的(尤其是中文環境),就是該文件的「預設編碼方式」。怎麼讓讀者的瀏覽器知道該文件最好用哪種編碼方式來開呢?只要在「檔頭區」<head> 標籤內加入下面這一行:

<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>

這樣人家就知道該文件預設編碼是用 UTF-8 Unicode 的方式了。除此之外,其實還有很多類似的資訊可以調整。如果是用 Blogger.com,其實有預設的檔頭資訊,可以找一下樣版文件裡有一行,藏在 <head> 裡面:

<b:include data='blog' name='all-head-content'/>

表示的是 Blogger 統一制訂的一些檔頭內容,如果檢視 Blog 首頁的原始碼,就可以看到上面那行展開以後的相對應標籤。你可以移除上面這一行,只把有需要的內容留下來,也可以在上面那一行的後面,或是 <title> 的前面,自己加入想使用的 head-content,端看個人需求。我分析了一下預設檔頭有的內容,主要有編碼、版權 (meta content) 和 Feed URL (link rel),既然沒有必要我就不動它。之前我有替這裡的 Blog 燒了一個 FeedBurner 的 Feed URL,那是一定要加進來的(有些 RSS Reader 會透過這項資訊去找 Feed URL),所以加了下面這一行:

<link rel='alternate' href='你的FEED URL' title='訂閱 Blog' type='application/rss+xml'/>

嗯!這樣像 Blogline 這類 Reader 從首頁分析就可以找到我的 Feed 資訊。另外,有注意到在瀏覽某些網站,或是把網站加入書籤的時候,這些網站都有它們自己的圖示?是的,這種首頁資訊也是宣告在檔頭裡,只要加下面這一行在你的樣版或首頁裡,人家看你的網站時,不管用什麼瀏覽器或想加入書籤還是我的最愛,都會看到你專屬的「書籤圖示」(favorite icon):

<link rel='shortcut icon' href='圖示檔連結位置'/>

預設的檔名是 favicon.ico,檔案格式一定要是 windows icon 的圖示檔(.ico),而大小標準是 16x16,如果你有一般圖檔 (jpg, gif or png),除了用繪圖軟體轉檔,也可以利用這個網站的服務(favicon from pic)來產生。不過玩 .ico 會發現:背景沒有透明、色盤顏色變少!如果你對圖示的要求比較高,甚至,還想搞動態 gif 來做書籤圖示,上面的語法就不適用囉!舉例來說,像我想用有透明背景的 .png 當作我的書籤圖示,那我可以使用下面這一行:

<link rel='icon' href='PNG圖示檔的連結位置' type='image/png'/>

如果是 gif 就把上面那一行 png 字樣改成 gif 就行了。(現在應該有看到我的書籤圖示吧!長這個樣子:)當然,如果你有自己的動態 gif 圖示,這個方法也可以讓你有動態的書籤圖示!如果還想知道有什麼能修改的檔頭資訊(其他的用處比較不大),也可以看下面的參考文章。

註:為了兼顧相容性,我的書籤圖示以上兩行都有加,因此分別有兩個檔案(favicon.ico & favicon.png)。

參考文章:
做個會跳會動的FavIcon玩玩吧!
自訂網址列圖示﹝FavIcon﹞
logger beta:头信息优化

回應: 2