2007-09-27

FTP Server 的安裝設定 (vsftpd & proftpd)

要對外提供檔案服務,除了在區域網路用的 Samba 之外,最常用的就屬 FTP Server 了。常見在 Linux 環境上用的 FTP Server 很多,舉凡像是 wu-ftpd, pureftpd, vsftpd 和 proftpd 都可以。wu-ftpd 是我第一個用、也用最久的服務,以前玩 FreeBSD 都用它來分享,但據說樹大招風、安全性堪慮,所以後來在 LinkStation 上面我一開始裝的是人家推薦的 vsftpd。vsftpd 顧名思義是 Very Secure 的 FTP Daemon,之前的經驗也很不錯,但是最討厭的,就是沒有一些簡易的查詢功能。假設我開 FTP Server,想知道現在有幾個人連進來、在做什麼,我只能去查 Log 檔。後來我又試用了另外一套 proftpd,嗯!果然是 Professional 的 FTPD,設定和參數複雜好多,為兼顧安全還有很多防堵機制,支援 Virtual Site 和類似 Apaceh .ftpaccess 的目錄權限控管機制,當然,最重要的也附了幾個公用程式供查詢使用,所以我就改用 proftp 囉!不過本文仍然保留兩種 FTP Server 的安裝和設定說明,要簡單的就裝 vsftpd,要複雜深入一點的就裝 proftpd,任君選擇(但是為了安全起見,兩個只挑一個就好,不要通通裝啊)。

1. vsftpd

在更新過 Package List 之後 (apt-get update),開始安裝 vsftpd:

apt-get install vsftpd

啊?這樣就裝好了?接下來改設定檔:

nano /etc/vsftpd.conf

...
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022

以上簡單的設定內容是,第一,不允許匿名的使用者登入,第二,允許本機其他合法帳號用 FTP 登入,第三,允許寫入的動作,最後一個,透過 FTP 登入後寫入檔目錄和檔案權限的設定。022 代表的是只有寫入的帳號自己能夠修改,其他人不能動,如果要同群組使用者都能變動的話,就要改成 002。其他詳細的參數請參閱鳥哥的說明。(真是草率)

接著重新啟動 vsftpd 就搞定了:

/etc/init.d/vsftpd restart

2. proftpd

一樣記得先更新 List,然後開始安裝 (Debian 官網也有說明,或是參考 proftpd 安裝使用手冊),不過切記裝過 vsftpd 再執行以下步驟是會有衝突的:

apt-get install proftpd

安裝過程會問你要裝成開機執行 (inetd) 還是手動執行 (Standalone) 的模式,請選 Standalone 的(如果選錯,一樣可以用 dpkg-reconfigure 來重新設定)。接下來會有些訊息,大意上是會幫你增加一個使用者 proftpd、把該帳號加到 nogroup 群組、程式裝到 /var/run/proftpd 目錄,並且又幫你建立匿名 FTP 用的帳號 (ftp)、群組 (nogroup) 和目錄 (/home/ftp),裝完試圖啟動服務的時候,可能會有以下的錯誤訊息(如果你有設 Host name,那 'localhost' 就會顯示你設定的名稱):

Starting ftp server: proftpd - IPv6 getaddrinfo 'localhost' error: Name or service not known

這個 IPv6 的問題有兩個解決方法,一個是透過設定檔關閉對 IPv6 的支援,另一個是在 /etc/hosts 裡面修改一筆記錄如下(把紅字部分改成你的 Server Name):

fe00::0 ip6-localnet localhost

無論如何,即使有錯誤訊息,FTP Server 也在跑了,在改設定之前我們先停掉服務,如果裝成 Standalone 模式,則用以下命令:

/etc/init.d/proftpd stop

如果是裝成 inetd 的開機啟動,則比較麻煩,要先找出 inetd 的 Process ID (ps aux | grep inetd)、砍掉 Process 才行 (kill -9 pid)。接下來修改設定檔:

nano /etc/proftpd/proftpd.conf

以下是我修改的部分內容,可以參考:

#======================= 預設設定 =======================
# Includes DSO modules
  Include /etc/proftpd/modules.conf
  MultilineRFC2228 on
  DefaultServer on
  ShowSymlinks on
  DisplayChdir .message true
  ListOptions "-l"
  DenyFilter \*.*/

#======================= 站台設定 =======================
# 伺服器的名稱和啟動模式
  ServerName "LinkStation"
  ServerType standalone

# 伺服器啟動的服務帳號和群組
  User proftpd
  Group nogroup
 
# 連接埠
  Port 21
# PassivePorts 49152 65534

# IPv6 支援
  UseIPv6 off

# 關閉 Ident 和使用者網域反查
  IdentLookups off
  UseReverseDNS off

# 使用本地時間
  SetEnv TZ :/etc/localtime
  TimesGMT off

# 設定支援下載續傳、上傳續傳、支援 FXP
  AllowStoreRestart on
  AllowRetrieveRestart on
  AllowForeignAddress on

# 預設檔案複寫設定
  AllowOverwrite on

# 顯示站台歡迎訊息
  DeferWelcome off

# 設定使用者登入和登出會看到的訊息檔
  DisplayLogin /etc/proftpd/welcome.msg
  DisplayQuit /etc/proftpd/logout.msg

# 指定站台系統 Log 位置
  SystemLog   /var/log/proftpd/proftpd.log
 
# 自己定義 Log 格式,紀錄登入 (login.log) 和傳檔 (transfer.log) 的細節
# TransferLog /var/log/proftpd/xferlog
  LogFormat myxfer "%{%Y/%m/%d %H:%M:%S}t [%u] \"%m %f\" (%bB/%TS)"
  LogFormat myauth  "%{%Y/%m/%d %H:%M:%S}t [%u] \"%r\": %S (%a)"
  ExtendedLog /var/log/proftpd/login.log auth myauth
  ExtendedLog /var/log/proftpd/transfer.log read,write myxfer

#======================= 外掛模組 =======================
# 控制帳號下載容量限制模組
<IfModule mod_quotatab.c>
  QuotaEngine off
</IfModule>

# 控制帳號上傳下載比例模組
<IfModule mod_ratio.c>
  Ratios off
</IfModule>

# 安全性模組 (For Reducing Timing Attack)
<IfModule mod_delay.c>
  DelayEngine on
</IfModule>

# 控制模組
<IfModule mod_ctrls.c>
  ControlsEngine        off
  ControlsMaxClients    2
  ControlsLog           /var/log/proftpd/controls.log
  ControlsInterval      5
  ControlsSocket        /var/run/proftpd/proftpd.sock
</IfModule>

# 管理模組
<IfModule mod_ctrls_admin.c>
  AdminControlsEngine off
</IfModule>

# 語言編碼模組,關閉 LangEngine 預設會用 UTF-8
<IfModule mod_lang.c>
  LangEngine off
</IfModule>

#======================= 連線和傳輸限制 =======================
# 最大連線數
  MaxInstances 30

# 預設踢掉斷線時間,當沒有傳檔、連線停頓 10 分鐘或動作閒置 20 分鐘就斷線
  TimeoutNoTransfer 600
  TimeoutStalled 600
  TimeoutIdle 1200

# 同主機只允許 2 個登入、同帳號只允許 3 個登入、最多只允許 5 個連線,以及其失敗的訊息
  MaxClientsPerHost 2 "一台主機最多只允許 2 個登入!"
  MaxHostsPerUser 3 "一個帳號最多允許 3 個登入!"
  MaxClients 5 "連線數超過上限!"

# 設定使用者群組 (ftpuser) 的下載頻寬 (200K)
  TransferRate RETR 200 group ftpuser

#======================= 存取設定 =======================
# 預設上傳目錄和檔案的讀寫權限,預設是 022,改成 002 表示屬同群組的帳號都可以更改
  Umask 002

# 不允許 root 登入
  RootLogin off

# 允許被設定成不得由遠端登入的帳號 (invalid shell) 能 FTP 進來
  RequireValidShell off

# 只要不屬於 ftpuser 群組的人,可以離開自己的預設根目錄
  DefaultRoot ~ ftpuser

# 預設關閉所有 SITE 命令以策安全
<Limit SITE_CHMOD>
  DenyAll
</Limit>

以上請根據實際的需求狀況來調整,詳細參數也可以參考官方文件

雖然我的設定檔裡大多已經附了中文註解,但有些東西可是精心調整過的,在這還是要說明一下(紅色的部份)。首先先看站台設定、登入和登出會看到的訊息,其中 welcome.msg & logout.msg 兩個訊息檔可以包含一些系統、登入和下載的狀況,以下是我做的登入歡迎訊息範例檔 (/etc/proftpd/welcome.msg,會顯示登入位址、伺服器時間、硬碟可用空間、目前路徑和連線數量):

Welcome %U from %R to %L site !
Current Time: %T
Available Capacity: %F KB
Current Directory: %C
Current/Max Allow Connection: %N/%M

以下則是登出的訊息檔 (/etc/proftpd/logout.msg,會顯示連線完,總共上傳和下載的檔案和容量):

Upload: %{total_bytes_in} bytes, %i files
Download: %{total_bytes_out} bytes, %o files
Bye Bye, %U from %R !

此外,「監看」FTP 狀態對開站是很重要的,除了預設的 SystemLog (/var/log/proftpd/proftpd.log),我自己定義了 Log 格式,搞了登入紀錄 (login.log) 和傳檔細節 (transfer.log) 的 Log 檔、取消原有的 TransferLog,讓系統的登入和使用者抓檔紀錄分開,也優化了裡面的格式,所以想看看誰沒事來登入、在 try 你的 FTP 站台,查看登入紀錄就行 (tac /var/log/proftpd/login.log | less),想知道誰貪婪了你什麼檔案,查看傳檔細節就能一目了然 (tac /var/log/proftpd/transfer.log | less)。如果常用這兩個命令的話,也可以直接在 /etc/profile 裡面新增兩筆 alias。

再來看看外掛模組的部份。需要特別解釋的,是關於 FTP 語系編碼的問題,之前提到我重灌的 Debian,用的都是標準 UTF-8 編碼,自然 FTP Server 供檔也要完全支援 UTF-8,首先要掛 mod_lang、讓 FTP Client 能自動偵測 FTP 站的編碼方式,所以在 FTP 程式連進來時,它能透過這個機制瞭解站台目錄和檔名的編碼方式,轉成正確的方式避免看到亂碼。接下來設定 FTP 語言編碼模組的預設值 (LangDefault zh_TW.UTF-8),這樣站台就能完全支援 UTF-8 囉!(當然 FTP Server 支援還不夠,FTP Client 抓檔程式一定也要支援,在這強力推薦一套 Freeware: FileZilla,不但完全支援 UTF、什麼中文日文檔名都沒問題,而且比照 CuteFTP 有的功能一樣都不少,重點還是免費 Open 的 Freeware,算是開站抓檔支援性最棒的工具!)最後是連線數量、傳輸頻寬的限制,不過以上都有詳細的範例和中文說明,設定調整應該不是什麼問題~

設定檔都搞定就可以啟動服務了。如果是 Standalone 就是以下命令:

/etc/init.d/proftpd start

如果是裝成 inetd 的,就重新執行:

/usr/sbin/inetd

另外在裝 proftpd 完,系統也多了幾個公用程式,像是 ftpshut,可以用來定期開關 FTP 服務(參數和用法請看鳥哥的教學文章),而 ftpcount 則是顯示目前 FTP Server 的連線數量,最後 ftpwho 可以顯示有誰正在線上、正在做什麼,這些實用的公用程式有助於監看服務的狀態(當然,也可以透過上面提到的自訂 Log 檔內容來知道)。

最後,要來討論帳號和權限的問題。我的作法是有一個 FTP 管理者的帳號 (admin),它沒有合法的 Shell (/bin/false),登入後目錄就是 FTP 的根目錄 (/home/ftp),它和其他服務的帳號 (samba, mldonkey, www) 和一般使用者都屬於同一個群組 (users),整個 FTP 根目錄權限都是同群組可讀寫 (chmod -R g+w /home/ftp),而且目錄權限都屬於 FTP 管理者 (chown -R admin:users /home/ftp/*)。所以我自己使用 FTP 的時候,都用這個帳號來登入,不但可以管理目錄,也可以和其他服務的檔案分享。由於我不打算開放匿名登入,匿名這一段的設定就跳過。最後要設定一些「親朋好友」的帳號,彼此之間的檔案才能互通有無,我的作法是另外設定一個群組 (ftpuser),然後新增 FTP 專用的帳號都設到這個群組,一方面在做 FTP 限制的時候可以用群組來做,另外因為 ftpuser 和 users 分屬不同帳號,所以只能讀取分享的目錄檔案無權刪除修改,只要目錄設定好,以後只要新增帳號就可以開放 FTP 給大家使用了。

有了以上的目錄權限安排,又新增一個專用的群組 (groupadd ftpuser,可以看到,我上面的設定檔有些限制就是對這個群組下的),假設要新增一個 FTP 專用的測試帳號 ftptest,命令如下:

useradd -s /bin/false -g ftpuser -d /home/ftp ftptest

這個帳號只能用 FTP 登入,受限於 ftpuser 的權限限制,登入後會在 /home/ftp 這個 FTP 根目錄下,而目錄存取權限就單純取決於實際的群組和帳號目錄權限。拿上面設定檔的範例來看,這個群組的成員,有下載頻寬限制 (TransferRate RETR 200 group ftpuser,200K),除了 FTP 目錄,也不允許離開預設根目錄 (DefaultRoot ~ ftpuser),像這樣在管理上,就有了很大的彈性。除了實體帳號對目錄存取的權限外,proftpd 也有自己對目錄存取設限的語法,以上面範例的狀況來看,既然我開放整個 FTP 目錄 (/home/ftp) 讓「會員」存取,但可能下面有幾個目錄,是不准 18 歲以下的人「看到」的,假設有個目錄叫 /home/ftp/AV、我不想給帳號 ftptest 這個人看到,只要在設定檔最後面補上這一段設定:

# 限制特定目錄不給看
<Directory /home/ftp/AV>
  <Limit All>
    DenyUser ftptest
  </Limit>
</Directory>

這樣帳號 ftptest 就完全看不到 AV 的目錄了。還有一個例子實際存取權限和 proftpd 設定混用的狀況,像是 Upload 目錄、希望大家都夠上傳寫入檔案,因此必須開放該目錄的寫入權限:

chmod -R o+w /home/ftp/Upload/

但開放寫入權限、就沒法避免所有人去砍檔案(A 上傳到 Upload 區的檔案可能被 B 給砍掉),上面提到我有個 FTP 管理者的帳號 (admin),它屬於一般使用者群組 (users),我希望除了該群組的成員外其他帳號在該目錄都沒有砍檔權限(即使是上傳的那個人),只要在設定檔最後面補上這一段設定:

# 限制上傳目錄不給砍檔和更名
<Directory /home/ftp/Upload>
  <Limit RNFR RNTO RMD DELE>
    AllowGroup users
    DenyAll
  </Limit>
</Directory>

這樣就阻擋了一般 FTP 會員(屬於 ftpuser 群組)砍檔的權利,賦予一般使用者(屬於 users 群組,包含 admin 管理員帳號)管理上傳區的能力。以上是 FTP Server 安裝設定的詳細步驟,其實要提供服務都很簡單,但比較麻煩的是服務之間目錄檔案的權限和帳號設定,我利用的關鍵是 Linux 同群組開放完全存取權限、搭配 FTP Server 提供的彈性,而 FTP 其他使用者是用另外獨立的群組來套用限制,這些邏輯在我其他安裝到 LinkStation 上的服務都是共通的,也是我 try & error 多次調整出來的經驗(一般介紹文都不提),搞定之後不但有快速高效率的檔案分享服務,和其他像網路芳鄰等服務混用的時候也不會綁手綁腳,實際使用上也才更有彈性。

回應: 8

 

2007-07-14

以年月份做分類的導覽連結列 (Year & Month Breadcrumbs)

如果像我用 Daily Archive 來做日曆的 Hack,會發現一個問題:要怎麼找當月份或是當年份的備份文章呢?之前很多朋友都發現 Archive 其實只有一個能生效,即使手動 Hack 塞了兩個,還是會不大正常。其實目前為止這個問題並沒有好的解法(除非不用那個日曆的 Hack),能夠做的就是在一些小地方加上連結,讓讀者可以看到當年份或是當月份的文章。這裡介紹的 Hack 是文章上方的導覽列(要點進特定文章才會出現),這個導覽列英文叫 Breadcrumbs,是「覆蓋在麵包上的小屑屑」,英文用得其實比中文「導覽列」 (NavBar) 更貼切(我也不知道中文怎麼翻,總不能真的叫麵包屑吧),Hack 完或實際特定文章連結看範例就知道是怎麼回事了。

原作者做的 Hack 是導覽連結列是 首頁 -> 標籤 -> 文章標題,不過眼尖的人會發現兩個問題:第一,如果有多個標籤該怎麼辦?第二,進到單篇文章裡面,文章一開始就有文章標題、最後面會列出該文章所有標籤,這個導覽連結列完全沒有可用性啊!因此有了改良,改成以時間來導覽連結,變成像是 首頁 -> 年份 -> 月份 -> 文章標題,嗯嗯!就樣也算是有了該篇文章當月或當年的 Archive 作用了。但是我發現這份改良還是有問題,作者當月的 Archive 還是借用 Monthly Archive 的連結來做的,像我用 Daily Archive 還是會不正常啊!研究了一下,原來 Archive 是用 Blogger 自己搜尋引擎的語法,帶入時間範圍當變數達成的,所以我就又修改了一下,當月的 Archive 一樣比照辦理,做出來文首的導覽列連結就不受 Archive 的型態和設定影響了!

一樣打開範本->修改 HTML->勾選「展開小裝置範本」,在 Blog 文章的這個 widget 區段內(<b:widget id='Blog1' ....> </b:widget>),找到顯示文章的那一個子區段,應該是下面這一行開始:

<b:includable id='main' var='top'>

這行下面表示的是在產生文章的完整內容,由於我們這個文首的導覽列要放在文章內容的前面,因此在產生的文章迴圈後、產生發表日期和標題前塞入下面紅色那一行:

<b:loop values='data:posts' var='post'>
<b:include data='post' name='breadcrumbs'/>
<b:if cond='data:post.dateHeader'>

而這個新加進來的 include 定義 breadcrumbs,我們也要宣告,因此下面的程式碼請加在 <b:includable id='main' var='top'> 這行的前面:

<b:includable id='breadcrumbs' var='post'>
<!-- Year & Month Breadcrumbs -->
  <b:if cond='data:blog.pageType == "item"'>
    <p class='breadcrumbs'>
      導覽連結:  <a expr:href='data:blog.homepageUrl' rel='tag'>首頁</a>
      <script type='text/javascript'>
        generateBreadcrumbs();
      </script>
      <b:if cond='data:post.title'>
        -&gt;  標題: <data:post.title/>
      </b:if>
    </p>
  </b:if>
<!-- End of Breadcrumbs Hack -->
</b:includable>

而上面的程式碼裡,有用到一段 Javascript 的函式 generateBreadcrumbs(),因此接著要把這個函式的宣告和定義放到樣版裡面。和之前的 Hack 一樣,把下面的 Javascript 程式放到樣版 </head> 標籤前面,或是自己定義的 Javascript 區段:

<script type='text/javascript'>
//<![CDATA[
<!-- Functions used for generating Year & Month Breadcrumbs: generateBreadcrumbs() -->
function generateBreadcrumbs() {
  var strHref = location.href.toLowerCase();
  var intWhereAt = strHref.lastIndexOf('/', strHref.indexOf('.html'));
  var intYear = parseInt(strHref.substr(intWhereAt - 7, 4),10);
  var strCrumbOutput = ' -&gt; 年份: <a href="/search?updated-min=' + intYear;
  strCrumbOutput += '-01-01T00%3A00%3A00-08%3A00&updated-max=' + (intYear + 1);
  strCrumbOutput += '-01-01T00%3A00%3A00-08%3A00">' + intYear + '</a>';
  var intMonth = parseInt(strHref.substr(intWhereAt - 2, 2),10);
  var intNextMonthYear = intYear;
  var intNextMonth = intMonth + 1;
  if (intNextMonth > 11) {
    intNextMonth = 1;
    intNextMonthYear += 1;
  }
  var strMonth = intMonth;
  if (intMonth < 10) strMonth = "0" + intMonth;
  var strNextMonth = intNextMonth;
  if (intNextMonth < 10) strNextMonth = "0" + intNextMonth;
  strCrumbOutput += ' -&gt; 月份: <a href="/search?updated-min=' + intYear;
  strCrumbOutput += '-' + strMonth + '-01T00%3A00%3A00-08%3A00&updated-max=' + intNextMonthYear;
  strCrumbOutput += '-' + strNextMonth + '-01T00%3A00%3A00-08%3A00">' + strMonth + '</a>';
  document.write(strCrumbOutput);
}
//]]>
</script>

最後就是外觀了。原始碼裡面用到了一個新定義的 CSS 變數:breadcrumbs,這是用來顯示這個導覽連結區段的 Style,所以在 CSS 定義的區段 <head> 標籤後面、<style>區段裡加入以下的 CSS (樣式請自行根據自己的樣版調整顏色、字型大小和分隔線):

/* Style for Year & Month Breadcrumbs */
.breadcrumbs {
 color: $sidebarcolor;
 letter-spacing: .1em;
 font: $postfooterfont;
 border-bottom:1px dotted $bordercolor;
 margin:0 0 0.5em;
 padding:0 0 0.5em;
}

存檔搞定!檢視首頁的時候好像沒什麼改變,因為顯示這個連結列的條件是:

<b:if cond='data:blog.pageType == "item"'>

也就是要點入單篇文章的時候,效果才會出來,顯示在文章標題的上面,我想在其他地方應該沒有導覽的必要吧~

參考文章:
Adding a Breadcrumb Trail to your Blogger Post
Year & Month Breadcrumbs

註:已修正 8, 9 月文章月份導覽會變成 0 的問題,原因是 Javascript parseInt(08) 的問題,改成 parseInt(08, 10) 就沒事了。

回應: 22

 

2007-07-13

Blogger 整合了 FeedBurner !

之前寫過 FeedBurner介紹,後來也把我所有在 Blogger 的 RSS Feed 都去註冊了一份,而且在頁面裡留下訂閱的圖示和連結。但是,預設在 Blogger Meta 標籤裡的資訊還是 Blogger 提供的 Feed,除非你改掉樣版裡整個 Meta 的資料,或是像我這篇提到新增修改檔頭資訊,不然還真的找不到可以新增或取代預設 RSS Feed 的方法。用一些 RSS Reader 來偵測我的首頁(以這裡為例),可以找到三個 Feed 的網址連結,其實內容不大一樣,但都有人訂閱:

http://abintech.twidv.com/feeds/posts/default - 預設(ATOM 版本)
http://abintech.twidv.com/feeds/posts/default?alt=rss - 預設(RSS 版本)
http://feeds.feedburner.com/abinlee-tech - 自己燒的,被 FeedBurner 優化過

FeedBurner 後來被 Google 併購之後漸漸釋出利多,從之前大家大聲讚揚、FeedBurner Pro 的付費版本大放送外,又公告了與 Blogger 的整合、允許使用者在 Blogger 裡設定,將預設的 Feed URL 改成 FeedBurner 的,這樣網站的 RSS Feed 就變成單一窗口,也不用自己去 Hack 了!雖然上述三個 Feed 還是都存在,但是使用上全部都 Re-direct 到 FeedBurner 去,Feed 總算還是使用了統一窗口,而且被優化過的 Feed 不管哪種版本的 RSS Reader 都可以正確美觀地使用,還在用 BSP 或系統提供的預設 Feed 嗎?趕快轉到 FeedBurner 的懷抱吧!

設定很簡單,只要登入 Blogger 的後台管理介面,選擇設定->網站提供,在 Post Feed Redirect URL 填入要轉址到 FeedBurner 的 Feed 就好了。官方也有相關的使用說明,如果你已經有用過或註冊過 FeedBurner,可以直接跳到第三個步驟繼續設定。

另外,同一時間 Blogger 也新增了投票模組,該模組叫做「意見調查」,要針對自己的讀者做問卷嗎?直接在範本->網頁元素裡,找你想新增的位置加入網頁元素就好了!Blogger 真的是越來越棒啦!

回應: 4

 

2007-07-07

AMP (Apache + MySQL + PHP) 的安裝設定

要利用 LinkStation 來架各種網站(個人網頁、Blog、Wiki 還是討論區),不能或缺的是 Linux 上必備的 AMP (Apache + MySQL + PHP),有了這些基本服務,只要抓程式碼回來解壓縮、做點調整,就可以提供各種 Web-based 的服務和功能。

第一個動作先來裝 Apache 這個 Web Server:

apt-get install apache2

安裝完畢,系統會自動啟動 Apache 服務(啟動過程會看到一點錯誤訊息,先不管),可以用瀏覽器試連網址:http://機器的IP位址,連上成功瀏覽器上會有「It works!」字樣。因為還沒搞好設定的部分,我們先停掉服務:

/etc/init.d/apache2 stop

如果未來有執行 Perl/CGI 的需求,記得要順道安裝給 Apache 用的 Perl 套件:

apt-get install libapache2-mod-perl2

接下來是調整主要設定檔。所有 Apache2 相關的設定檔都在 /etc/apache2 目錄下,以前可以在 /etc/apache2/apache2.conf 裡面一次搞定,現在卻要分散到各處來設定 XD。首先是 Apache 服務執行時預設的編碼語系。目前主流預設都是 UTF-8,但是 Apache 卻是 ISO-8859-1,先編輯 charset 設定檔:

nano /etc/apache2/conf.d/charset

把 AddDefaultCharset UTF-8 前面的 # 刪掉,這樣服務器預設使用的編碼就會是 UTF-8 了。而 Apache 服務的連接埠設定,在檔案:/etc/apache2/ports.conf 裡面,預設是 80,沒要更動所以不用改。接下來設定需要用到的用戶和群組,看 apache2.conf 裡面提到它是連結到檔案 /etc/apache2/envvars,裡面的內容是:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
...

顧名思義,它定義了執行時 Process 的身份、群組和 ID,預設用的是 www-data,為了好看 (?!)、還有和其他服務共享的目的,所以我新增一個帳號 www,並且更改群組到 users,要手動修改帳號資訊,要編輯 /etc/passwd:

nano /etc/passwd

在最後面新增一列:

www:x:106:100:www:/home/www:/bin/false

並且把 envvars 的內容改成:

export APACHE_RUN_USER=www
export APACHE_RUN_GROUP=users
....

新增的帳號名稱是 www,帳號 ID 是 106 (請自己找一個不重複的)、群組 ID 是 100 (屬於 users 這個群組,不確定可以看 /etc/group 內容)、帳號說明以及所屬根目錄 /home/www(這個目錄請自行建立、chown & chgrp 給 www & users),而且也不允許一般登入。以上非硬性規定,可以根據個人需要調整。還記得安裝完、服務自動啟動看到的錯誤訊息嗎?訊息像是:

Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

原因是服務不認得所在機器的名稱,只要在設定檔裡加入機器的 alias 就能排除這個訊息(其實不影響服務啟動),編輯設定檔:

nano /etc/apache2/httpd.conf

加入一行(用系統預設的 hostname):

ServerName %h

該服務的基本設定到此差不多就搞定了,接下來要設定的是網站實際網頁檔案放置的目錄,也就是網頁對外提供服務的根目錄。這裡先處理預設的網站,系統裝好用的預設目錄是 /var/www,對應到網站的根目錄 (http://localhost),要修改關於預設站台的設定檔:

nano /etc/apache2/sites-available/default

範例的設定檔內容為:

<VirtualHost *:80>
        ServerAdmin root@localhost
        DocumentRoot /home/www/
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /home/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>
        ScriptAlias /cgi/ /home/www/cgi-bin/
        <Directory /home/www/cgi-bin>
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>
        ErrorLog /var/log/apache2/error.log
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
        CustomLog /var/log/apache2/access.log combined
...
</VirtualHost>

以上已經把 www 的目錄指定到 /home/www,也就是把預設網站的網頁根目錄從 /var/www 改到 /home/www。原先的 cgi 目錄指定到 /usr/lib/cgi-bin/,這裡移到 /home/www/cgi-bin/ 下面(目錄也要記得自己建啊),方面網站檔案管理。最後有一段關於 doc 的 alias,完全沒用所以我就拿掉了。最後記得把剛剛那個會顯示「It works!」的網頁檔案複製到新目錄:

cp /var/www/index.html /home/www

啟動伺服器囉(以上設定都正確的話,應該沒有任何錯誤訊息):

/etc/init.d/apache2 start

接下來檢驗服務是否有啟動(每個服務驗證都適用喔):

nmap localhost

裡面應該要有一筆 Port 80 的記錄(像這樣:80/tcp open http),代表服務在跑囉~然後用你的瀏覽器直接連 http://機器的IP位址,一樣看到「It works!」就成功啦!既然上面有裝 CGI 用的 Perl,這裡一定也要測試一下,在設定放 CGI 的目錄下建立一個檔案:

nano /home/www/cgi-bin/test.pl

裡面的內容是:

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World!";

存檔後離開,記得更改成可執行檔的屬性(chmod a+x /home/www/cgi-bin/test.pl),然後用瀏覽器連網址:http://機器的IP位址/cgi/test.pl,如果有看到「Hello, World!」,那麼 Perl CGI 也運作正常啦!

如果要在 Apache 上面做 Virtual Host (不同網址、指定到同一個 IP、卻指向不同目錄的網頁目錄),在 /etc/apache2/sites-available 目錄下建立一個設定檔,假設以網域名稱當檔名 (範例的網域叫做 forum.test.com,而對應到的實體路徑是 /home/www/forum):

nano /etc/apache2/sites-available/forum.test.com.conf

然後貼入以下內容(請依網域名稱和網頁目錄更改):

<VirtualHost *>
        ServerAdmin webmaster@localhost
        Servername forum.test.com
        DocumentRoot /home/www/forum
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /home/www/forum>
                Options -Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
</VirtualHost>

在 /home/www/forum 放入一個測試的首頁檔,接下來在 /etc/apache2/sites-enabled 目錄下建立虛擬網站的連結(該目錄應該已經有一個上述 default 的網站連結),以上面的設定檔為例:

ln -s /etc/apache2/sites-available/forum.test.com.conf ./001-forum.test.com

接著重啟 Apache (/etc/init.d/apache2 restart) ,虛擬站台 forum.test.com 就可以生效了(可以開瀏覽器連連看)!搞定網頁伺服器,依照順序 (A、M、P),接著來安裝 MySQL:

apt-get install mysql-server

安裝過程會要求你輸入 MySQL Server 資料管理員 root 的密碼(和系統 root 帳號不一樣),安裝完也會順便啟動服務,可以用下面的命令(和剛剛設定的密碼)去檢查:

mysqladmin -u root -p ping

如果想實際登入,用命令列操作本機的資料庫,可以用以下命令:

mysql -p

這樣預設是以管理者帳號 (root) 登入本機 (localhost),只要輸入剛剛建立的密碼就行了(登入後可以用命令 'show variables;' 看看目前預設的參數設定)。資料庫編碼和語系的問題很常見,尤其是中文亂碼,所以在裝完資料庫後直接設定 Daemon 和 Client 的編碼方式,強制全都用 UTF8,這樣就一勞永逸了~先編輯設定檔:

nano /etc/mysql/my.cnf

裡面找到兩個 Section,分別是 [mysqld] 和 [client],各加入以下設定:

[client]
....
default-character-set = utf8

[mysqld]
...
default-character-set = utf8
init-connect = 'SET NAMES UTF8'

編輯完後存檔,重新啟動 MySQL:

/etc/rc.d/init.d/mysql restart

這時候就搞定資料庫預設編碼的問題啦(一樣可以用 mysql -p 登入資料庫,用 'show variables;' 看看目前關於編碼的參數,原來 character_set_xx 和 collation_xx 後面有 latin1 字集的設定,應該都變成 utf8 了)!至於登入之後有什麼命令、怎麼使用資料庫,請參閱中文參考手冊。最後把 PHP 支援給裝上,主要包括 PHP5 (for Apache),對 MySQL 資料庫和加密功能的支援:

apt-get install php5 php5-mysql php5-mcrypt

完成之後就通通搞定了。以上套件都安裝完先不要重啟,還有設定要改。接下來對 PHP 做設定,編輯設定檔:

nano /etc/php5/apache2/php.ini

搜尋 (Ctrl+W) default_charset,原來是 iso-8859-1,改成:

default_charset = "utf-8"

現在可以重啟 Apache 了 (/etc/init.d/apache2 restart)。要驗證 PHP 能不能動,可以做一個測試檔,然後看看能不能顯示完整的 PHP 和相關功能。在網頁目錄下做一個 test.php (nano /home/www/test.php),填入下面的內容:

<?php
phpinfo();
?>

接著用瀏覽器連接 http://機器的IP位址/test.php,測試正常的話會秀出 PHP 的資訊。有了 PHP,我們來裝一套一套透過 PHP 來管理 MySQL 的網頁工具:PHPMyAdmin,為求安裝單純和程式的最新版,我們不用套件安裝的方法來做 (apt-get install phpmyadmin),抓最新版解壓縮就能用了。直接上官網、到下載頁面找最後的版本,複製連結後在 LinkStation 裡再 wget 下載。舉個例子來說明,我下載的是 3.1.4 全語系版,下載並解壓縮在 /tmp 下面(以下連結不一定能用,請確定官網的最新連結和檔名),把整個目錄改名稱搬到我們預設的網頁根目錄下 (/home/www)、最後刪除用不到了的壓縮檔:

cd /tmp
wget http://prdownloads.sourceforge.net/phpmyadmin/phpMyAdmin-3.1.4-all-languages.tar.bz2
tar -xjf phpMyAdmin-3.1.4-all-languages.tar.bz2
mv phpMyAdmin-3.1.4-all-languages /home/www/phpMyAdmin
rm -f phpMyAdmin-3.1.4-all-languages.tar.bz2

接下來要做個設定檔(預設沒有),並且自訂一個 cookie secret 這樣 phpMyAdmin 才能動(本步驟是參考官網的 Quick Install):

cp /home/www/phpMyAdmin/config.sample.inc.php /home/www/phpMyAdmin/config.inc.php
nano /home/www/phpMyAdmin/config.inc.php

找到下面這一行,填入一段十六進位的亂數,長度內容不限(下面紅色那個是範例,請訂自己專用的):

$cfg['blowfish_secret'] = 'ba17c1ec07d65003';  // use here a value of your choice

這樣就搞定了。 瀏覽器輸入 http://機器的IP位址/phpMyAdmin,用剛剛安裝 MySQL 那組帳號 (root) 和密碼就能登入。如果嫌 phpMyAdmin 名字太長,可以去更改網頁根目錄下面 phpMyAdmin 這個目錄名稱就行了。登入後,可以仿造 root 權限新增一個資料庫管理者帳號,像是 admin,設定完整權限後再砍掉原先的 root 帳號,會比較不容易和系統 root 搞混。(如果愛用命令列登入的,因為管理者帳號不是 root 改成 admin 了,記得用 mysql -u admin -p 來登入)

備註:後來發現登入 phpMyAdmin 常有奇怪的警告,雖然好像不理也沒關係,但一直有個問題總不大舒服,因此這邊加註解決方法。

1. 關聯資料表的附加功能未能啟動。這是因為預設 phpMyAdmin 需要在 mySQL 裡面有一個自己用的資料庫,剛灌完 mySQL 當然沒有、phpMyAdmin 也不會自己建,所以要自己手動處理。先用 mysql -p -u admin 登入 mySQL 資料庫,建立需要的資料庫:

create database phpmyadmin;

用 quit 登出後,用預先定義好的 table 資料匯入剛剛建好的資料庫 phpmyadmin:

mysql -p -u admin < /home/www/phpMyAdmin/scripts/create_tables.sql

接著編輯 phpMyAdmin 的設定檔(/home/www/phpMyAdmin/config.inc.php),移掉 Advanced phpMyAdmin features 下面十行前面的 "//" remark 符號,登出再重新用 phpmyadmin 登入就沒有這個訊息了。

2. Server running with Suhosin. Please refer to documentation for possible issues. 這是提示有啟用 Suhosin 的 PHP 保護機制,要你去調整一些參數有的沒的(請自行瞭解那是幹嘛的),討厭看到這個紅字的,可以到設定檔最後加上如下關閉 warning 提示的參數就行了。

$cfg['SuhosinDisableWarning'] = true;

相關軟體差不多都設定完了,為避免未來安裝其他程式和存取共用的問題,可以把整個網頁根目錄 (/home/www) 的使用者和群組通通設定成上述我們新增的那個工作帳號 (www) 及所屬群組 (users):

chown -R www:users /home/www

到此 AMP 就都安裝設定完畢,現在我們有一個強大的網頁伺服器 Apache、還可以設定虛擬站台,有 PHP5 的支援,還有一套 MySQL 資料庫,這個資料庫還有 Web 介面的管理工具:PHPMyAdmin,有了這些個軟體環境,不管單純做個網站,還是要架設討論區、Blog,都可以很容易地架設起來了。

回應: 7

 

2007-07-05

Samba Server 網路芳鄰共享的設定

Samba 是用來提供網路芳鄰服務、讓附近的電腦可以直接存取 LinkStation 裡面的檔案,甚至如果把 USB 印表機接上 LinkStation 的 USB Port,還可以透過它來分享印表機哩!這種存取檔案的方法雖然沒有直接用 FTP 來得快,但是如果用來變成網路硬碟,別的電腦不用複製就可以播放和分享這個網路硬碟的音樂或影片、燒錄或安裝放在 LinkStation 裡面的映象檔或程式,實用性更是大大地增加了,LinkStation 儼然成為家裡區域網路上的多媒體中心和檔案伺服器,讓內部分享和使用更加便利。再進階一點就變成 NAS (Network Attached Storage),可以作為中小企業的檔案伺服器,內建的目錄和權限管理,能因應一般公司大部分的檔案分享需求。

首先先安裝 Samba 的套件:

apt-get install samba

這樣會幫你安裝 Samba 所需的相關套件。接下來調整設定檔:

nano /etc/samba/smb.conf

Samba 設定檔主要是設定像是存取權限、連線效率、語系編碼(中文目錄和檔名)以及分享目錄等等,部分參數已經存在,要修改內容,部分參數是要整段新增的,以下是我的範例(可以用 Ctrl+W 尋找字串來修改):

#======================= 站台設定 =======================
[global]

# 更正編碼語系,除 DOS 外都改成 UTF8,不然就用 Big5
  display charset = UTF8
  dos charset = CP950
  unix charset = UTF8

# 伺服器描述
  server string = "Server"

# 預設工作群組
  workgroup = WORKGROUP

# WINS 支援
#  wins support = no
;  wins server = w.x.y.z
  dns proxy = no
;  name resolve order = lmhosts host wins bcast

# 封包傳遞項目設定,以提昇效能
  socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192

# Log 檔相關設定、Log 檔最大值 (KB)、要不要透過 syslog 來紀錄
  log file = /var/log/samba/log.%m
  max log size = 1000
  syslog = 0

# Samba 掛掉的處理
  panic action = /usr/share/samba/panic-action %d

#======================= 認證設定 =======================
# 登入認證設定
#  security = share
  security = user
 
# 密碼加密、與系統密碼同步
  encrypt passwords = true
  unix password sync = yes

# 密碼處理程式及相關限制
  passwd program = /usr/bin/passwd %u
  passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssucces$
  passdb backend = tdbsam
  obey pam restrictions = yes
  pam password change = yes

# 匿名登入(帳號、處理)
  guest account = samba
  map to guest = Bad User

解釋一下上面參數的意思。一開始是處理目錄檔名編碼語系的問題,現在安裝好的應該都是 Samba Server 3.x,在一開始我們裝 Debian 時有設定過系統預設語系是 zh_TW.UTF-8,所以預設顯示和操作都要設成 UTF-8,而外部 Dos 存取則設成 CP950(給 DOS 存取用的,反正 DOS 不支援 UTF、只支援 ANSI),這樣就能解決大部分中文目錄檔名在分享和存取上變成亂碼的問題。

重頭戲來了,要接著設定 Samba 分享的權限和存取控制。初步的概念是,希望能夠同時開放匿名存取、方便朋友或其他網路裝置來做不需認證的存取 (Read-only),另一方面又希望像檔案伺服器一樣,讓有帳號的人能在伺服器上有自己的目錄放些私人檔案,最後,還要有個分享目錄是專門給有帳號的人共用的,這些「會員專屬」的分享目錄當然不希望匿名存取的人看到,以上,聽起來相當複雜是吧~看看設定檔中關於認證設定的部份,要兼容匿名和帳號登入,首先要將安全層級設定為使用者 (security = user,如上述設定檔所設)、並設定密碼加密及與系統同步共用,這樣在 Debian 裡新增的帳號和密碼,就可以與 Samba 共用了(不需要另外設定 smbpasswd)!接下來我們需要一個匿名帳號,給沒帳號的訪客登入使用,設定檔裡我指定了一個匿名帳號叫 samba (guest account = samba),這個帳號預設不存在,所以要手動新增,我們直接修改 /etc/passwd:

nano /etc/passwd

加一筆資料像是這樣:

samba:x:103:100:samba:/etc/samba:/bin/false

其中 103 是 User ID,不能和 passwd 裡面存在的重複(所以要自己找一個沒人用的,103 是我系統還沒人用到的 ID),而 100 是 Group ID,預設應該是 users 這個群組才是(如果不是請自行調整)。到此,基本設定的部份算是完成了,緊接著要補上分享目錄的資訊和設定。根據以上需求,我需要三種目錄:第一種是有系統帳號的人,能夠在伺服器裡有自己專用的目錄放私人檔案,第二種是給有系統帳號的人,能夠做會員間分享存取使用,最後一種,不管你有沒有帳號,都可以具名或匿名存取的公用目錄。這三類目錄的分享設定如下(請把以下範例直接補到 /etc/samba/smb.conf 後面):

#======================= 分享設定 =======================
[Homes]
  comment = Home Directories
  valid users = %S
  browseable = no
  writeable = yes
  create mask = 0644
  directory mask = 0755

[Share]
  comment = Private Shared Folder
  path = /home/samba
  browsable = yes
  writable = yes
  valid users = @users
  create mask = 0664
  directory mask = 0775
 
[Files]
  comment = Public Shared Folder
  path = /home/ftp
  browsable = yes
  writable = no
  write list = abin
  public = yes
  create mask = 0664
  directory mask = 0775

第一段 [Homes],顧名思義就是每個帳號的「家目錄」,當使用者用自己的帳號密碼登入後,該目錄名稱就會變成自己的帳號名稱,假設系統裡有個帳號叫 abin、它在系統裡的家目錄是 /home/abin,那麼登入後 Samba 會連結目錄到 /home/abin、給這位使用者 abin 直接使用(很直覺吧)。第二段 [Share],分享目錄指定到 /home/samba(沒這個目錄自己建立,記得 chown -R samba:users /home/samba/),其中指定了 valid users = @users,意思是「只有合法登入的一般帳號」才能夠存取使用,這個目錄就是「會員專屬」的分享目錄。最後一段 [Files] 就是開放給所有人(包含匿名)的公用分享目錄(範例中指定到 FTP 的共用分享目錄),注意其中我關閉了公用目錄「寫入」的權限(也就是任何人透過 Samba 進來都只能讀取),而指定只有 abin 這個帳號的人可以寫入 (write list = abin),表示該目錄有限定管理者,這樣自己透過 Samba 進來進行存取,也方便做目錄檔案的管理。

特別注意的是,我這邊用同屬一般使用者群組 (user) 的帳號來做 Samba 分享目錄的管理者,用的是和 FTP 服務共用的分享目錄,以我設定的檔案目錄創建屬性(create 0664, directory 0775),一樣是「屬於同群組的帳號擁有完全的讀寫權限」、和 FTP 設定的管理權限一模一樣,所以從檔案屬性來看,可以知道分享目錄裡的檔案來源是從 FTP 還是 Samba 來的,而且不管從哪來,FTP 或 Samba 管理者都可以做目錄檔案的管理,不會被不同來源的權限給擋住,在跨服務、同目錄的管理才能有最大的彈性,同樣也兼顧了安全性。設定好設定檔和帳號存取問題,就可以啟動 Samba 服務囉!設定檔的部分,Samba 有提供一個驗證工具,啟動服務前可以執行 testparm,它會幫你檢驗設定的參數正不正確。沒問題的話就直接重新啟動 Samba:

/etc/init.d/samba restart

這時,其他的電腦就可以透過網路芳鄰存取 LinkStation 了。當有電腦來存取的時候,還可以用 smbstatus 這個命令查看連線的狀態,看那個機器正在使用 LinkStation 的資源。用以上分享的範例,到 Windows 網路芳鄰、開啟工作群組電腦,會看到多一台電腦,點進去裡面有兩個分享的資料夾:Share、Files,如果點進 Files,算是直接匿名登入,Log 會顯示有個 Guest 叫 samba 的連進來,如果改點 Share 目錄,這時候會要求你敲帳號密碼登入,不敲就看不到,而用帳號登入後除了可以看到 Share 的內容、可以存取檔案之外,回到上層目錄會看到多一個和自己帳號一樣的目錄出現,那個就是自己私人在伺服器上的目錄啦!這裡有一個 Windows 用網路芳鄰連線的小技巧,一般開完機用網芳連過,基本上就沒有「登出」「重新登入」的機會了,如果在測試時修改 Samba 設定然後用 Windows 測試時,不能反覆登入是很麻煩的事,這裡可以 DOS 開視窗、用下面的這個命令,強迫 Windows 的網路芳鄰斷線登出,這樣要測試匿名登入或帳號登入時,就不會受到 Windows 不給登入的限制:

net use * /delete

到此為止呢,在 LinkStation 上面已經完成 Samba 服務的設定,也可以透過網路芳鄰與區域網路內同個網段的電腦做檔案共享,但,人家可以透過網路芳鄰連進 LinkStation,那能不能登入 LinkStation 後透過機器去存取其他也有提供 Samba 服務的電腦、利用 LinkStation 使用網路芳鄰的資源呢?上面我們提到的安裝 Samba 服務,接下來我們來安裝透過 Samba 來存取其他電腦的 Client 程式:

apt-get install smbclient

裝完系統內會多了幾個公用程式,像是想要瀏覽網路芳鄰,可以用命令:

findsmb

它會幫你找整個區網、列出同一個 Workgroup 的電腦,找到電腦以後根據主機名稱 (hostname) 可以用:

smbclient -L '主機名稱'

這個命令會列出該電腦有分享出來的資源(直接用 smbtree 也行),假設分享的目錄名稱是 Files 目錄,要連進去該目錄用下述命令:

smbclient '\\主機名稱\Files' -U '登入帳號'

輸入密碼(匿名登入的話直接按 Enter)就登入了(確定匿名沒密碼可以直接用 smbclient -N '\\主機名稱\Files' 進去)。接著會出現操作的提示符號:smb: \>,你可以下和 ftp 接近的檔案操作命令 (get, mget, put, mput, mkdir, rmdir ....),進行檔案的相關操作。

最後一個和 Samba 有關係的就是「網路磁碟機」,在 Windows 下面我們可以把某個網路芳鄰分享的目錄掛載成一台網路磁碟機,並給它一個磁碟機代號,透過 smbclient,我們能存取別人電腦的分享目錄,那能不能也把那個目錄,掛載成 LinkStation 的某個路徑,像用網路磁碟機一樣?這時候我們要另外裝一個套件,裡面包含一些 Samba 檔案系統 (smbfs) 的公用程式:

apt-get install smbfs

裝完會多一個 smbmount 公用程式,或是預設的 mount 也會多支援 Samba 專用的檔案系統 (smbfs)。如果要掛載某個分享目錄到本地的路徑,命令是:

smbmount '//主機名稱/Files' /mnt/samba -o codepage=UTF8,iocharset=UTF8

這樣就是把網路某分享目錄掛載到自己的某個目錄啦 (/mnt/samba),這裡也可以用 mount -t smbfs 替代 smbmount 來操作。嗯,所有 Samba 的服務和工具差不多就這樣了,如果想玩網路印表機分享(驅動程式要支援)、更複雜像是 LDAP、AD 之類的管理機制,可以更深入去研究 Samba 的用法~

後記:現在主要的網芳 client 越來越多是 Windows 7 的了,偏偏 Windows 7 在傳統網路芳鄰的資源上很差,試了很多次改什麼 Windows 的 registry 通通不管用,敲什麼帳號密碼都沒辦法登入(Windows XP 就沒這些問題),最後直接在 samba 裡面新增專用帳號和密碼,這樣才能通過身分認證並連結系統的原生帳號。假設我們要允許帳號 admin 能存取有權限設置的目錄(必須登入),先在 samba 裡新增帳號:

smbpasswd -a admin

過程會要求設置密碼,這是用來登入 samba 用的帳號密碼,必須要是系統存在的帳號,但密碼可以和系統內的不一樣。如果要知道系統裡的 samba 已經被加了幾個這樣的帳號,可以用命令:pdbedit -L 列出來,如果要刪除則用 pdbedit -x。

參考文章:
鳥哥 - SAMBA 伺服器
使用 Samba 架設中小企業 File Server

回應: 13

 

2007-06-28

MLDonkey - 萬用 P2P 下載工具 (eMule, BT)

MLDonkey 是一個相當好用的 P2P 工具,可以架設成伺服器,提供遠端控制下載的服務,還有內建的文字和網頁操作介面,隨時在任何地方連進來,都可以要求這個服務幫你做 P2P 的下載。而且一套工具,不但支援 eDonkey (& emule)、標準 HTTP 和 FTP 下載,甚至連 BT 也可以整合在一起,算是支援最廣、最方便,而且又相當強大的下載工具(可以參考各種檔案分享工具比較)。要安裝 MLDonkey,記得先更新 Package List,然後直接安裝:

apt-get update
apt-get install mldonkey-server

安裝過程中可以將 MLDonkey 設定為開機啟動(執行身分為新增的使用者 mldonkey、屬於 mldonkey 這個群組)、預設程式目錄為 /var/lib/mldonkey,安裝過程也會要你設定上下傳頻寬限制(之後可以再改,可以都用預設值),裝完也會詢問是否要直接啟動。可以先啟動看看有沒有安裝錯誤,順利起來沒錯誤的話,因為要進行設定檔的修改,所以要停掉剛執行 MLDonkey Server (mlnet) :

/etc/init.d/mldonkey-server stop

由於如果 MLDonkey 在執行中,停止後會寫入設定檔 (/var/lib/mldonkey/downloads.ini),因此如果要更改設定檔,切記 MLDonkey 已經停止,不然中途改的設定都會在 MLDonkey 停止時被還原蓋掉。MLDonkey 所有組態檔包括 /etc/init.d/mldonkey-server (啟動指令檔)、/etc/default/mldonkey-server (啟動參數檔) 和 /var/lib/mldonkey (組態檔路徑),在組態路徑下還有預設的暫存 (temp/) 和下載分享 (incoming/) 路徑,MLDonkey 開始下載後這兩個目錄下面就有會有檔案了,如果你不打算把下載和暫存的東西放在像是 /var/lib/mldonkey/temp, /var/lib/mldonkey/incoming 下面,也要一併去修改設定檔。接下來在服務啟動前,我們來進行設定檔的修改:

nano /var/lib/mldonkey/downloads.ini

我修改的地方大致如下(請找檔案中符合名稱的變數來修改):

...
allowed_ips = [
"127.0.0.1";
"192.168.1.0-192.168.1.255";]
...
max_hard_upload_rate = 100
max_hard_download_rate = 0
...
temp_directory = "/tmp/mldonkey"
...
create_file_mode = 664
create_dir_mode = 775
...
shared_directories = [
{
 dirname = "/home/ftp/P2P"
 strategy = incoming_files
 priority = 0
};
{
 dirname = "/home/ftp/P2P"
 strategy = incoming_directories
 priority = 0
};]

第一行最重要,是用來限制能夠連進 MLDonkey 伺服器的 IP 位址,預設是 127.0.0.1(只有本機可以連),後面補的那一行 192.168.1.0-192.168.1.255 代表的是在 192.168.1.* 同一個網段內的機器都可以連得進去(也可以用 192.168.1.0/24),為了安全起見,請依照自己的需求去更改。接下來兩行是限制最大上傳和下載的流量(單位 KB,安裝時也有設過)。再來是下載時暫存檔的位置(預設是 temp,代表的是 /var/lib/mldonkey/temp,請改成自己想放暫存檔的地方,範例改到 /tmp/mldonkey 去),以及檔案和目錄下載後預設的檔案存取權限(644 & 755 的意思是,該檔案目錄的擁有者 mldonkey 和同一個群組的使用者,都擁有完整讀寫刪除的權限)。最後一段,顧名思義是設定你下載的檔案和目錄放置位置 (incoming_files, incoming_directories),如果有其他目錄願意開放分享給別人搜尋和下載,可以再加一筆記錄(在右中括號 ']' 號之前,放在 {}; 裡面),把 strategy 設成 all_files 就可以了。改完設定後存檔,設定檔的部分就完成了。啟動伺服器之前,要確定上述的目錄都建立了(/tmp/mldonkey, /home/ftp/P2P)、權限都設定正確,不然實際讀寫可能會有問題。

我的規劃是,所有能分享的資料都在 /home/ftp 下面,包含網路芳鄰 Samba、FTP,而為了這些服務都能夠相互支援(建檔、殺檔),所以這些服務所需要的工作帳號都屬於同一個群組 (users),只要把目錄和檔案建立的權限都改成 755 & 664,這樣的話 MLDonkey 下載的檔案,完成後放到 /home/ftp/P2P 目錄,透過網路芳鄰存取或 FTP 登入也可以搬移砍檔。一開始提到安裝 MLDonkey 時如果設做開機啟動,服務會自動建立一個虛擬使用者 mldonkey(不能實際登入使用),它屬於 mldonkey 這個 Group,因此會發現後來下載的檔案和目錄權限都是屬個這個使用者和群組。我們要做的修改很簡單,就是把 mldonkey 這個使用者指定到 users 群組:

usermod -g users mldonkey

並且手動建立上述需要用的目錄、把權限都改成 mldonkey 這個使用者、群組改成 users:

mkdir /tmp/mldonkey
mkdir /home/ftp/P2P
chown -R mldonkey /tmp/mldonkey
chgrp -R users /tmp/mldonkey
chown -R mldonkey /home/ftp/P2P
chgrp -R users /home/ftp/P2P
chgrp -R users /var/lib/mldonkey

這樣我們就可以確定,MLDonkey 下載暫存和分享的檔案會在我們設定的路徑下,而檔案權限和其他服務也可以一併共用,未來系統裡面的某個檔案,也可以透過 Owner 知道是怎麼來的。還有一個地方被寫死要改的:

nano /etc/default/mldonkey-server

這裡的群組要改成 users、檔案權限要從 0022 改成 0002 才可以:

MLDONKEY_USER=mldonkey
MLDONKEY_GROUP=users
MLDONKEY_UMASK=0002

設定都完成,就可以啟動 MLDonkey Server 了(服務模式啟動):

/etc/init.d/mldonkey-server start

服務啟動正常的話,就可以連進伺服器測試看看。可以用 Telnet 連進去 (telnet 機器IP位址 4000),或是用瀏覽器連網頁操作介面 (http://機器IP位址:4080)。如果兩個都連不進去,有可能是服務沒跑起來(ps -aux | grep mlnet 沒紀錄),可以用執行檔模式來跑跑看,有沒有錯誤訊息:

/usr/bin/mlnet

這是前景模式的執行方法,啟動有錯誤的話訊息都會顯示在螢幕上。如果不是設定的問題,通常啟動失敗、都是因為一些暫存檔沒被砍掉導致,砍光再試試看:

rm -f /var/lib/mldonkey/*.tmp

如果前景模式跑得起來,那麼服務模式應該也沒問題,可以用 Ctrl+C 中斷前景模式,重新用服務模式啟動就行了!上面提到 download.ini 裡面的設定,其實也可以透過 Telnet 進去的文字介面或是瀏覽器連進去的網頁介面來做,所以改 download.ini 設定檔算是伺服器沒啟動時的改法,一旦伺服器啟動,用服務啟動後提供的介面來調整,也可以即時變更和儲存。另外,除了預設提供的這兩個介面,還有很多其他搭配的 Client 程式(不過要另外安裝),詳細的說明和工具可以參考這裡

我碰到的這個版本預設管理者帳號是 admin,但沒有密碼,所以不管怎麼登入都不會問帳號密碼(如果安裝過程有問,就可以用命令 dpkg-reconfigure mldonkey-server 來重設)、預設就用 admin 登入,為了登入安全,建議還是要設定一下密碼。設定密碼建議用 telnet 比較簡單,直接 telnet localhost 4000 登入服務,進去後敲命令 whoami 會顯示你登入的帳號是誰(如果有設定密碼,會秀 'Command not authorized'),如果跑出預設帳號 admin,可以下命令 'passwd 密碼' 來設定密碼,只要密碼被設定起來,不管怎麼登入要使用就會被問密碼了。

最後說明一下 MLDonkey 的用法。如果是用網頁介面,一連進去會要求你填登入帳號和密碼。登入後畫面相當簡單,左上有幾個按鈕,右上則是讓你輸入 MLDonkey 指令的命令列。如果要開始下載,只要去複製 P2P 的下載網址(eDonkey - ed2k://files,BT -  http://xxx//files.torrent,或是標準的 http:// 或 ftp://),貼進命令列,在前面加個 dllink 的下載命令 (Download Link 的意思),壓下 Input 按鈕就完成了,如果有大批網址,也可以先用用 DL 按鈕叫出介面、通通剪貼進去批次下載。下面貼幾個官網示範的命令範例(如果是 ed2k:// 開頭的下載網址,dllink 命令其實可以省略):

dllink ed2k://|file|SuSE_V8.1_CD1.iso|648416|250C684D459|/
dllink http://www.open-bits.org/download.php/Openoffice_1.1.4.tar.gz.torrent
http http://67.84.8.14:88/beethoven/karajan.rar
http ftp://xdonkey.macdk.net/dl/XDonkey.dmg

我喜歡用 Web 介面來看所有載點的下載狀況,壓下第一個 Transfer 按鈕會顯示所有正在下載的工作,包括檔案名稱、大小、完成度和載點的情形。像是剛剛修改 download.ini 設定的部分,也可以用 Options 按鈕做詳細的各項設定,此外,像是檔案搜尋 (Search)、伺服器連結狀況 (Servers) 和統計資料 (Statistics),所有功能都可以在網頁界面上顯示和操作。文字介面的操作速度反應更快,不過一堆的命令就比較不友善了。Telnet 進去後其實什麼操作都不能做,要先手動通過身份認證:

auth admin 密碼

接下來就可以使用各種文字命令了。在提示符號下直接貼上一堆的下載命列(和 Web 介面一樣,如果不是 ed2k:// 開頭的,要加上 dllink 命令),就可以快速批次下載。而命令 vs (view downloads) 可以列出所有正在下載的工作,每個工作前面會有個 Index,像是 [D  1],如果要取消、暫停或繼續某個下載工作,用命令 cancel/pause/resume Index,就可以對特定工作做處理。關於設定的部分,也可以用 options、options section 和 set option value 等命令來查看和修改。所有的命令說明和使用方式,官網這裡也有詳細的說明。

MLDonkey 也許下載的效率比不上訂製專用的軟體,但是在使用上的便利性、支援性和操作彈性都是其他下載工具難以望其項背的,它並不是單純的一個下載工具,而是一個可以提供遠端登入使用、允許不同使用者帳號操作的下載服務(可以建立該服務自己的多個使用者帳號,和作業系統無關,提供不同使用者操作),有了這項服務,LinkStation 才能變成名符其實的專門分享的「動物機」,丟入載點網址機器就會乖乖幫你一個個拖回來,即使多人共用,也有便利的權限區隔,這真是 Linux 平台上必裝不可的好東西啊!

補充:預設 MLDonkey 有支援網頁介面登入,但問題是需要特別的連接埠 4080,偏偏這種特別的 Port 很容易被一般防火牆擋住不准用。如果有安裝網頁伺服器,一般不擋的 Port 80 又會被佔用,想用 Port 80 同時跑網頁服務和用 MLDonkey 的網頁介面就相互衝突了!不過如果跑的網頁伺服器是 Apache,網路上有一篇文章提到可以透過 Apache 來做 Redirection、將 Apache 的特定目錄流量直接轉到 Port 4080,這樣就可以用 Port 80 直接使用 MLDonkey、又不會和網頁伺服器衝突啦!(原文請參考:ApacheRedirection

首先,要先啟動 Apache2 的 Proxy & Rewrite 模組,不然會認不得設定檔裡的命令(導致啟動 Apache 時跑出 Invalid command 的錯誤):

ln -s /etc/apache2/mods-available/proxy.conf /etc/apache2/mods-enabled/proxy.conf
ln -s /etc/apache2/mods-available/proxy_http.load /etc/apache2/mods-enabled/proxy_http.load
ln -s /etc/apache2/mods-available/proxy.load /etc/apache2/mods-enabled/proxy.load
ln -s /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled/rewrite.load

接下來修改 Port 80 預設的網站設定檔:

nano /etc/apache2/sites-available/default

在設定後面、結束標籤(</VirtualHost>)前面加入下面這一段:

# Allow port 4080
<Proxy http://localhost:4080>
        Allow from all
</Proxy>
# Redirection
RewriteEngine On
RewriteRule ^/mldonkey$ /mldonkey/ [R]
RewriteRule ^/mldonkey/(.*) http://localhost:4080/$1 [P]

存檔後重新啟動 Apache:

/etc/init.d/apache2 restart

這樣就完成 Port80 的 ApacheRedirection 啦!只要打開瀏覽器直接連:http://機器的IP位址/mldonkey/,Apache 會幫你轉向到本地端的 Port 4080,這樣就可以用瀏覽器直接使用 MLDonkey、不怕被防火牆擋住,也可以和網頁伺服器共用 Port 80,不影響網站運作啦!(不過有兩點要注意的,第一,開放出去後,為了安全性 MLDonkey 最好一定要設密碼。第二,因為是靠 Apache 直接用 localhost 轉向連線要求,所以對 MLDonkey 服務來說所有連線都是從 localhost 來的,本來那個 allowed_ips 的限制連線設定就沒效啦!要特別注意相關的安全問題。)

回應: 40

 

2007-06-22

Debian 的安裝與設定 (上)

經過上一篇的韌體更新,擁有了可以登入 LinkStation 並且改機所需的軟體環境,接下來要開始安裝實際改機要用的作業系統:Debian Linux。之前 OpenLink 的韌體是放在 /dev/hda1,而我們改機使用的作業系統是放在 /dev/hda3 上面,剛好 hda3 有被 mount 成 /mnt,因此我們只要把 Debian 安裝到 /mnt 下就可以了(/mnt 就是未來改好機的根目錄)。先檢查網路的 DNS 設定(避免 wget 解析不到網址):

bash-2.05a# cat /etc/resolv.conf
# frontalot's static setup (adjust to your network settings)
#
search
nameserver 168.95.1.1
nameserver 168.95.192.1

需要修改的話,輸入 nano /etc/resolv.conf 即可進行編輯(和更新韌體一樣,以上兩筆記錄是 Hinet 的 Name Server)。

其中 nano 是一套文字編輯工具,習慣的用 vi 也可以,編輯方法與一般文書軟體差不多,按 Ctrl+W 可以搜尋字串,其他用法請參考 HELP, 編輯完按 Ctrl+X 存檔,出現提示時按 y,不更改檔名的話直接按 Enter 即可存檔,有時退出 nano 畫面不會自動清除,可以輸入 clear 清除畫面。

輸入 cd /mnt 切換到該目錄,下載人家修改好的 Debian(壓縮檔案大小大概是 32 MB):

wget http://downloads.buffalo.nas-central.org/LSHG_PPC/Distributions/Debian/debian-sarge_powerpc-hdhglan-1.11.tar.bz2

輸入底下指令解開安裝檔,解完壓縮後原始安裝檔可以刪除以節省空間:

bunzip2 debian-sarge_powerpc-hdhglan-1.11.tar.bz2
tar xvf debian-sarge_powerpc-hdhglan-1.11.tar
rm -f debian-sarge_powerpc-hdhglan-1.11.tar

接下來要把 root 切換到 /mnt 這第三分割區 (/dev/hda3) 底下:

chroot /mnt /bin/bash

用 passwd 設定密碼,一樣要輸入兩次做確認。接下來讓所有網域都可以存取這台機器,加入一筆記錄:

echo "ALL : ALL" >> /etc/hosts.allow

接下來一樣要設定 Debian 開機以後的網路設定,內容和韌體的差不多,編輯設定檔:

nano /etc/network/interfaces

去掉原本 DHCP 的設定改為固定 IP,記得還有 Default Gateway 也要設(依照個人網路環境調整):

# we always want the loopback interface
#
auto lo
iface lo inet loopback
# default dynamic setup (no adjustment necessary)
#
#auto eth0
#iface eth0 inet dhcp
#      hostname `hostname`
# frontalot's static setup (adjust to your network settings)
#
auto eth0
iface eth0 inet static

address 192.168.1.1
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.254

編輯登入後的狀態:

nano /etc/init.d/utelnetd

把原來是 bash 的地方改成 login:

#/bin/sh
/sbin/utelnetd -l /bin/login &
exit 0;

以上就調整好網路和登入的相關設定了。不過要注意的是,chroot 後當下使用的其實是 hda3 的設定,記得仿造上面一開始對 dns 的設定,修改 /etc/resolv.conf(這個檔案 chroot 後其實是在 hda3,而不是之前修改 hda1 的),有了正確的 DNS 接下來要透過網址下載檔案(ex. wget)才會通。緊接著應該是安裝 SSH Server、讓新裝好的 Debian 有安全登入的環境,不過因為網路上很多套件已經都要依存於 Kernel 2.6 的 libc6,SSH 也不例外,為了後面安裝的套件都能夠順利,接下來應該先幫 Debian 做核心升級,上到 2.6 才能繼續其他的操作(如果之前有上「U-Boot」,換 Kernel 到 2.6 更是必要動作)。因為預設的 Telnet Daemon 不允許 root 登入,所以先手動增加一個帳號方便 Telnet 登入(用命令 'adduser 帳號' 新增帳號,新增完畢記得用 'passwd 帳號' 設定密碼),登入後再 su 成 root 比較方便。

如果有裝 U-Boot,要將之前裝到 hda1 /boot 下面的檔案先複製一份到 hda3 的 /boot 下面(目錄下放的是 U-Boot 的 Boot Loader 檔案)。由於現在是 chroot 到 hda3,所以要在環境下先 mount hda1,才能把 hda1 的檔案複製過來(先確定有沒有 /mnt 這個目錄,沒有的話手動建立):

mount ext3 /dev/hda1 /mnt/
cp /mnt/boot/*.* /boot/

接下來要上 Kernel 2.6 囉!安裝步驟和之前類似,先下載解壓縮並安裝所需檔案:

cd /tmp
wget http://hvkls.dyndns.org/downloads/latest-openlinkhelper.tar.gz
tar -C / -xvzf latest-openlinkhelper.tar.gz
chmod 1777 /tmp
wget http://hvkls.dyndns.org/downloads/latest-webinstaller.tar.gz
tar -C / -xvzf latest-webinstaller.tar.gz
touch /boot/variant-uboot
touch /boot/variant-ug
/usr/local/sbin/webinstaller-kernelinst.sh

備註:後來再做到這邊時發現,裝 2.6 kernel 過程會有問題 (errors in /usr/local/sbin/webinstaller-kernelinst.sh),主要關鍵是 Can't install Debian's module-init-tools,會要求你裝完元件後重跑一次。當下當然沒辦法裝這個模組啊(硬去裝問題更多)!解決方法的方法是:不管它!因為 kernel 其實已經更新了,直接重開的話,登入後就會發現是 2.6 kernel (Linux 2.6.25.20-svn365-dirty493 ppc)。不管這個錯誤據我瞭解的後遺症是,接下來切換 kernel 的命令會有問題、而且再也回不去 kernel 2.4(強迫只能用 2.6)。不過應該沒有人沒事會想降回來吧,因為在 2.6 安裝的程式很多到 2.4 是不能跑的呀!因此,如果 webinstaller-kernelinst.sh 有問題的話,也不用跑下個步驟切換核心,有裝 U-Boot 這時候就可以重新開機了,沒裝的話請跳過到下個步驟做分割區切換。

然後用以下命令切換 Kernel:

/usr/local/sbin/kernel26.sh

有裝 U-Boot 的話,這時候就可以重新開機(exit, reboot)了(因為 U-Boot 的目的就是幫你切換開機分割區,成功的話,用 nc 會監看到從 boot/uImage 開機)!

如果沒裝 U-Boot 的話,要靠手動切換分割區才能指定從 Debian 這個分割區開機,因此接下來的步驟就很重要,也就是韌體開機分割區和 Debian 分割區開機的切換(以下步驟,如果有裝 U-Boot,千萬不要做)。由於 LinkStation 一開機的 Boot Loader 會使用 hda1 作為開機根目錄,所以如果要用 hda3 的 Debian 來開機,勢必要有工具去切換這兩個分割區(hda1 <-> hda3)。另外,為了怕 Debian 的分割區(實際改完機的根目錄)被我們玩壞,我們希望關機重開都會回到預設的韌體分割區下,了不起就手動再切換也可以,確保改機的安全性。因此在 Debian 開機的時候,就要改回下次重開是由韌體那個分割區啟動,一旦停電或是改機的作業系統弄壞想重灌,才能確保一定都能夠開機修復。這個 Swap 硬碟分割區的工具要另外下載,把它放在 /bin 目錄下,並且改執行權限:

cd /bin
wget http://abinlink.googlecode.com/files/swappart_ppc.gz
gzip -d swappart_ppc.gz
chmod 755 swappart_ppc

接下來要確保一開機一定會執行,切換到開機執行目錄:cd /etc/init.d/,新增編輯一個執行檔:nano swaphd.sh,內容如下,就是切換分割區並留下 log 記錄:

#!/bin/bash
/bin/swappart_ppc /dev/hda /dev/hda
echo "$(date) -- swaphd ok" >> /var/log/swaphd.log

最後要更改這個執行檔的權限,並且在開機的時候都會被啟動(需注意第二行最後面有個點也要輸入):

chmod 755 swaphd.sh
update-rc.d swaphd.sh start 99 2 3 4 5 .

到此為止第三個分割區 (hda3) 裡的 Debian 已經設定完畢,用 exit 離開,回到原來的韌體環境,我們還需要在韌體環境可以手動切換到 Debian 分割區的執行檔(剛剛下載的那個是在 Debian 自動切換回韌體用的),複製一份剛剛下載的工具,並產生手動切換分割區的執行檔 (swaphd),更改檔案屬性:

cd /bin
cp /mnt/bin/swappart_ppc /bin/
echo '#!/bin/bash' > swaphd
echo '/bin/swappart_ppc /dev/hda /dev/hda' >> swaphd
chmod 755 swaphd

有了在 Debian 自動切換回韌體分割區的執行檔 (swaphd.sh),以及從韌體分割區手動切換到 Debian 分割區的執行檔 (swaphd),在韌體分割區的工作就大功告成了。接著試著手動切換分割區,並重新開機:

swaphd
reboot

有裝 U-Boot 的人開完機直接從這邊開始,以上 swaphd 的步驟統統跳過。

剛剛不是有要先新增帳號,重新開機完這時候還沒有 SSH、而 Telnet 又不允許 root 登入的情況下,重新開機完就只能用新增的帳號密碼登入,然後切換到 root 身份:

su -

敲入 root 的密碼,檢查一下現在的環境是不是用 /hda3 的 Debian 開機的(用命令:df,看一下第一行根目錄 '/' 是不是掛載在 /dev/hda3 下),不過應該沒問題啦,因為搞錯分割區,新增的帳號是無法登入的!如果登入有問題,代表沒切到 hda3、還在 hda1 的話,用 U-Boot 的人可以透過 Power 的按鍵組合重試,沒 U-Boot 的可以透過重新執行 swaphd 再開機一次,應該就可以順利用 hda3 的 Debian 開機了!

用 U-Boot 的人會發現,預設開機不按 Power 鍵是進到 hda3 沒錯,但看 df 出來的結果怪怪的,怎麼會有兩筆資料一樣、都是掛載 /dev/hda1?明明 hda3 也有掛成功啊?這時候可以手動修改檔案系統表:

nano /etc/fstab

修改成正確的掛載列表,df 顯示就會正常了!

接下來可以用下列命令來檢查 Kernel 版本:

uname -mrs

順利的話應該是 2.6 以上(我看到的是:Linux 2.6.25.20-svn365-dirty493 ppc),然後也可以用下面命令檢查 Debian 的版本:

cat /etc/debian_version

這時候還沒升級 Debian,所以版號還是 sarge (3.1)。登入順利、Kernel 也上到 2.6 了,接下來才能進行 Debian 的調校和設定。

To be continued ...

回應: 58

 

2007-06-18

LinkStation 改機之韌體更新

開始改機之前,先瞭解一下 LinkStation 開機運作的原理。啟動時機器會先執行 Flash 裡面的 Boot Loader,接下來以硬碟裡第一個分割區的根目錄當作系統根目錄 (/dev/hda1) 讀取 Kernel 後並開始開機,第二個分割區當作 Swap,而第三個分割區 (/dev/hda3) 就當作主要 Samba & FTP 分享用的空間(預設還有第四個分割區,看起來是割剩沒用的)。LinkStation 出廠時含硬碟,在 hda1 已經安裝了原廠的 Firmware,其他分割區也都規劃好,只不過這個原廠的韌體只提供 Web 介面的管理模式,不能 Telnet/SSH,也不能去安裝其他工具軟體,所以韌體的首要工作,就是替換掉 /dev/hda1 的那個「作業系統」,先讓我們能夠透過Telnet/SSH 連進去,這樣才能夠開始改機。

可以用來替換的韌體有三種,第一種是 Buffalo 官方的韌體,只提供基本功能不能改機,如果沒有要改機的話、或改過想要回復原廠狀態,也可以去找最新版官方韌體來更新,最後官方的韌體在這裡下載 (v1.61這裡也有,另外還有一個修改官方 TelnetEnabled 的版本,不過,是日文版)。第二種是根據官方韌體修改而來,渾名叫做 OpenLink,它兼顧了保留原廠 Web 介面的設定方式,增加了一些工具,也開放了 Telnet/SSH 連進來亂搞的彈性。第三種就和原廠沒關係了,叫做 FreeLink (v1.11),是一個以 Debian 為核心、用來取代原廠韌體的版本(此版本我沒有試過,有勇氣的可以到這邊下載)。為了兼顧相容性,這裡使用的是第二種:OpenLink 來取代官方韌體(所有機種能用的韌體可以參考 Custom Firmwares 這個比較的頁面,超完整的)。

更新韌體前,最好把 LinkStation 的 IP 改成固定 IP,避免用 DHCP 反覆重開機後搞不清楚倒底最後 IP 是那個、導致連不進去。可以利用說明書提到光碟片裡附的公用程式:IPSetup 去找到同樣插在同一個區網上的 LinkStation 並設定好 IP,以下說明都以 192.168.1.1 為範例,請自行變通應用為自己設定的 IP。接下來下載最後版本的 OpenLink 韌體,網址在此,最後版本為 0.51b,這個連結是給 LinkStation HG (Gigabits Version) 專用的,其他機種請到下載根目錄找。解開壓縮檔裡面有個韌體更新專用的公用程式: HD-HGLAN FWUpdate.exe,它的作用是會幫你找到區域網路上的 LinkStation、然後幫忙更新韌體,依指示進行,更新完後察看面版電源燈是否停止閃爍,停止後表示更新完成。如果是 XP SP2,更新之前切記先到控制台裡面關閉 Windows 防火牆,不然怎麼更新都會失敗。

接著就可以 Telnet 進去了,預設應該是沒有密碼的。登入之後先設定網路,輸入以下指令增加 DNS 設定(不然會認不得網址,這兩筆是 Hinet 的 Name Server)

echo "nameserver 168.95.1.1" >> /etc/resolv.conf
echo "nameserver 168.95.192.1" >> /etc/resolv.conf

輸入 cat /etc/resolv.conf 確認檢查是否正確加入:

bash-2.05a# cat /etc/resolv.conf
#
# resolv.conf  This file is the resolver configuration file
# See resolver(5).
nameserver 168.95.1.1
nameserver 168.95.192.1

接下來檢查 IP 相關設定,輸入 cat /etc/network/interfaces 檢查 IP 位址是不是正確、是否有 gateway,沒有的話輸入 echo "gateway 192.168.1.254" >> /etc/network/interfaces 增加設定。下面範例中的設定,IP 是固定的 192.168.1.1,gateway 是 192.168.1.254 ,請依照自己的網路環境做調整。

bash-2.05a# cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.1.1
netmask 255.255.255.0
broadcast 192.168.10.255
gateway 192.168.1.254

以上網路設定完畢後,可以輸入 ping google.com 試試網路是否可以對外連線,此步驟一定要成功,因為接下來的安裝步驟都需要線上下載安裝,所以對外連線一定要正常。

網路都沒問題後,緊接著把 OpenLink 0.51b 更新成最新版(這裡也有提到手動更新從 0.51b 到 0.73b 的方法),先建立暫存目錄,然後下載最新的 0.73b v7 並更新:

cd /tmp
mkdir update
cd update
wget http://downloads.buffalo.nas-central.org/snapshots/update-ppc-OL-0_5x-0_73b_v7.tar.gz
tar -xzvf update-ppc-OL-0_5x-0_73b_v7.tar.gz
./update_ppc_OL_0.5x-0.73b.sh

這個更新會幫你更新一些 Library、新版程式,並且安裝 OpenSSH(SSH 是一個比 Telnet 更安全的登入介面)以及 SSH 的預設金鑰,更新完 0.73b Open SSH 的 sshd 並不會馬上執行,但是重新開機就會了,此時可以下命令 reboot 要求系統重開,試試看 SSH 登入是否成功正常。

從 Kernel 2.4 升級到 2.6

注意!如果是想要嘗鮮,或即將要安裝、已經安裝 U-Boot、這個要塞到 ROM 裡面的 Boot Loader,以下的改機步驟在重開機前才要進行。不過更換 Kernel 有一定的風險,請三思而後行!

更新 Kernel 到 2.6 可以先參考原文:Linux Kernel 2.6 Installation on Buffalo Linkstation/KuroBox/HG/HS/Terastation

簡化原文內容,說穿了就是先抓相關的安裝程式和檔案、先做 U-Boot 設定:

cd /tmp
wget http://hvkls.dyndns.org/downloads/latest-openlinkhelper.tar.gz
tar -C / -xvzf latest-openlinkhelper.tar.gz
chmod 1777 /tmp
wget http://hvkls.dyndns.org/downloads/latest-webinstaller.tar.gz
tar -C / -xvzf latest-webinstaller.tar.gz
touch /boot/variant-uboot
touch /boot/variant-ug

然後透過 WebInstall 來即時線上下載並安裝設定:

/usr/local/sbin/webinstaller-kernelinst.sh

安裝完畢之後,它會在 /boot 下建立 U-Boot 所需的 Boot Kernel 和相關檔案,此時系統其實是同時並存 2.4 和 2.6 的檔案,而且還是維持在使用 Kernel 2.4,如果要把該系統切換成 2.6,還要執行以下手動的命令:

/usr/local/sbin/kernel26.sh

如果又不想用了,想換回 Kernel 2.4,那就手動執行以下命令還原:

/usr/local/sbin/kernel24.sh

如果是為了 U-Boot,其實不一定要切換到 2.6。因為重點是要有那個 Boot Kernel、以及系統裡有 2.6 用的相關檔案才能跑,所以其實安裝好就夠了,有必要再去切換 2.6 吧!決定好 Kernel,順手檢查上面更改過的 DNS 和網路設定,如果有被蓋掉記得改回來,確認無誤後再重新開機吧!

重新開機完,應該就可以用 SSH 登入了,如果沒有 SSH 登入工具,可以去這裡下載 PuTTY 這個 SSH 終端程式。輸入 LinkStation 的 IP 位址,Port 輸入 22,使用 SSH 模式,其餘不用更改即可連線。如果有出現警告要按 Yes 接受(第一次連線的金鑰確認),輸入帳號 (root) 和密碼後即可登入。第一次 SSH root 登入的密碼會被改成預設的 'openlink',記得登入後先用 passwd 去改掉。

登入系統以後,先來看看磁碟機分割區的訊息。預設的硬碟機裝置是 /dev/hda,所以用命令:mfdisk -p /dev/hda,會顯示如下的硬碟分割區訊息:

bash-2.05a# mfdisk -p /dev/hda
Units = /dev/hda, 623MB
/dev/hda1 = Linux, ext3
/dev/hda2 = Linux swap, swap
/dev/hda3 = Linux, ext3
/dev/hda4 = Linux, ext3

這樣的意思是說,在 /dev/hda 這台磁碟機裡有四個分割區,分別是 hda1, hda2, hda3, hda4,和一開始提到的一樣,可以用命令 df 看看實際使用狀況:

bash-2.05a# df
Filesystem           1k-blocks      Used Available Use% Mounted on
/dev/hda1               373359    141041    213042  40% /
/dev/ram0                14521       841     12930   7% /mnt2/ram
/dev/hda3            383604592     32872 383571720   1% /mnt

現在所在的根目錄是屬於第一個分割區 hda1,有三百多 MB,是 Buffalo 預設系統使用的分割區。hda3 是存放使用者檔案的空間,掛在 /mnt 之下也佔了大部分的空間。下一階段要安裝的 Linux 系統為 Debian,會安裝在 /dev/hda3 中,只要透過工具與 /dev/hda1 對調之後,就可以從 hda3 開機然後把 Debian 當成預設系統了。以後就算灌到亂掉,只要恢復回 /dev/hda1 開機、使用 Buffalo 預設系統將 /dev/hda3 格式化,就可以重灌了。一開始提到的 FWUpdate,原理上就是先儲存設定、然後砍掉 hda1 的資料重新灌一份。

韌體必要的修改和設定都做好了,還有一些小東西改不改就看個人需要囉,像是更改登入 Shell 的設定(Prompt 提示符號、Alias,修改 /etc/profile)、更改主機名稱(用命令 hostname 指定主機名稱、在 /etc/hosts 加一行 IP 與主機名稱的紀錄,像是 192.168.1.1 LinkStation)、甚至是改登入提醒畫面(/etc/issue、/etc/motd,以及登入前提示 /etc/issue.net,不過要先編輯 /usr/local/etc/sshd_config 設定 Banner /etc/issue.net 才能打開 SSH 的登入提示),這些都是讓你登入韌體分割區後操作上比較方便和好看。最後要補充的,根據這篇文章說明,有些分享服務 (FTP, Samba) 的設定檔為了韌體安全都會自動幫你做備份和回復,也許沒必要,但如果你在韌體的分割區有要用 Samba 或 FTP、而且有改過設定檔 (/etc/samba/smb.conf, /etc/proftpd.conf),那麼這個「自作聰明」的還原機制就很討厭了,可以參考修改 /etc/init.d/chkshare 這個檔案,把某個檔還原動作的區段裡 /bin/mkcode -a > /dev/null 這一行前面加一個 '#' Remark 起來,就可以關閉了。

到此為止,我們完成了將磁碟機裡第一個分割區內的原始韌體更新成 OpenLink、而且換成最新的 0.73b,不但保留原廠的 Web 管理介面,也提供了能夠改機的軟體環境和 SSH 登入能力,不過這只是開啟了改機的大門,真正改機實際要使用的作業系統(要裝在第三個分割區)都還沒有下載安裝。不過以上步驟除非你想回復原廠、改用新版或是硬碟故障,不然之後的改機(即使系統重灌)都不用再碰到更新韌體的步驟了。至於像是硬碟故障、分割區重劃、需要拆機的硬碟重灌,或是手動的韌體還原,會有其他關於重灌和還原的文章做更詳細的說明。

回應: 15

 

2007-06-01

LinkStation 的升級 Part1: 更換硬碟

去年買了 LinkStation 當作我的個人伺服器之後,一直揮霍著內建的 160G 硬碟,當時買最小容量型號的目的,就是我慢慢用、用到硬碟又跌價而且我也塞爆的時候,再換大硬碟就是了。當時 400G 的型號和 160G 差了將近一萬塊,到現在 500G 硬碟也才五千多,所以能撐就能省到錢啊~話說我最近入手 500G 硬碟的目的就是為了升級 LinkStation,但是本來 LinkStation 就不允許你這麼拆殼換硬碟(一拆殼就破壞一年的保固),而且換硬碟也沒那麼簡單,所以我做足了功課、才敢開始進行硬碟升級的工作。

接下來我會一步一步描述怎麼進行(圖多,分了八個步驟),我雖然一次就順利成功,但是因為多虧了有前人的指點和說明,以下的照片也都引用自 Mobile 01 的文章,一方面補上自己的經驗、另外也算幫忙備份好文和好照片,引用到的照片版權還是屬於發表的作者 ATB & Danielsu。我參考的文章在這裡:Mobile01 - 窮人的NAS之重武裝版,圖片也都是引用這篇文章的。

步驟一,取下鏡面面版下的小螺絲。面版是強力膠黏住的,用刀片或一字起子從隙縫輕輕撬開(別弄傷或折到鏡面面版啊),將面版慢慢掀開就看得到黑色的小螺絲鎖住。這時候要用鎖眼鏡用小螺絲起子才能把螺絲卸下來,上下各有一個小螺絲,一定要都卸下來才能繼續。

步驟二,卸下弓字形灰色塑膠框。這個框框是用扣住的,只要用小螺絲起子戳進去壓下卡筍、往正面面版方向推,就可以卸下一邊,另一邊一樣操作,就可以把整個塑膠框拿下來。


步驟三,鬆開主機構螺絲。這個機殼和主機構固定的唯一螺絲是躲在標籤貼紙的後面,小心地掀開貼紙(並不會很黏,請放心),鬆開螺絲就行了。

步驟四,取下白色外殼的上蓋。除了主機構螺絲,外殼的結合主要還是靠上下各兩個卡筍,兩手同時壓下卡筍撥開上蓋,另一邊也這樣做一次,就可以取下白色外殼的上蓋了。

步驟五,取下主電路板。拿掉上蓋後,整個電路板背面就整個露出來了,只要鬆開四個角落的螺絲,就可以取下主電路板。照片板子左邊有 LED 顯示的透明導光塑膠片,取下電路板的時候要小心別弄斷或損壞了。

步驟六,翻開主電路板,卸下電源供應組。電源供應的機板對角共有兩個螺絲,鬆開就可以取下。(小心電容會放電,儘量不要碰到電路板後面的銲點,我被電到兩次..囧)


步驟七,翻開背後檔板和電源供應電路板,取下硬碟鐵架。鎖硬碟的鐵架是靠卡在白色外殼的下蓋上面,這裡有點難弄,小心拉起鐵架慢慢抽出來(小心別破壞了下蓋),取出鐵架整個外殼的下蓋也分離了。這時候如果有空氣罐或是清潔工具,可以稍稍清潔一下背後檔板上的風扇和上下蓋,這裡灰塵應該很多,沒弄乾淨未來可能會影響散熱的效能。



步驟八,卸下硬碟鐵架上的兩個螺絲,取下硬碟。不要像照片這樣同時鬆開兩個螺絲,這樣硬碟被鬆開的時候可能會小小敲到地上,可以一手扶著硬碟,一手鬆螺絲,兩個螺絲鬆開後、拉開排線和電源接頭,硬碟就算可以取下了。



最後補上一張,所有組件大部分解的照片。做以上動作的時候我都戰戰兢兢,沒時間分神來拍照,只好都引用現成的,不過最後順利拆完就鬆了一口氣,一定要替自己被「分屍」的 LinkStation 拍張真相。(所以只有最後一張是自己拍的,左上角那台硬碟就是即將換上的 500G 硬碟..)

拆下了硬碟,千萬不要就急著把新硬碟插上去,或是貿然把舊硬碟 Format 掉啊!別忘了硬碟裡面的東西,還沒有備份也沒有重置或重載啊!在原文裡,提到的是用 Acronis Trun Image 幫你 Clone 整個硬碟,不過我找到的最新版本,啥?是一個開機光碟的 ISO?這要怎麼樣在 Windows 環境下硬碟複製啊!我手邊的 Ghost,也是要用光碟片開機進到 DOS 模式使用,偏偏我只能接兩個 IDE 裝置(因為系統另兩個是 SATA 介面),光碟開機再接一個硬碟就滿了,怎麼去做「光碟開機」後的「硬碟間複製」啊~另外一個硬碟接上 IDE 轉 USB 的線,光碟開機 DOS 下也認不到啊~最後多虧我的「倉庫」裡有 Acronis Trun Image 的舊版 8.0,安裝之後有提供在 Windows 環境下做磁碟機 Sector by Sector 的複製(因為硬碟裡的 Linux 格式 Windows 不認識,一定要這樣複製),開始對拷之後我就去睡覺了(160G 透過 USB Copy 到硬碟,要很久吧)。這是一種處理的方式,透過這個我沒用過的 True Image,把舊硬碟裡的東西完全複製到新硬碟去(不過要注意,新硬碟的多的空間是不是指定到正確的 Partition 囉)。那,可不可以用很多人習慣的工具 Ghost 呢?可不可以順道把舊硬碟的資料在複製前做個備份映像檔燒到光碟片、以後不幸硬碟壞掉能夠用光碟灌回去?如果在備份前舊硬碟就已經掛了,更換硬碟此舉只是為了換掉故障硬碟,如何還原硬碟裡原廠的韌體、再經由改機恢復 LinkStation 個人伺服器的運作呢?別急,以上的疑問我會再另文討論,請期待囉!

回應: 4

 

2007-05-26

LinkStation HG 硬體規格剖析

在買 LinkStation 之前,我也被各種不同版本類似的產品搞得頭昏眼花,每每都要比較一下型號和規格才知道彼此的差異。在 Buffalo @ NAS-Central 上面有強者做出相當詳細的比較表,還有圖片解說用來判斷不同版本,對此我也整理一下說明,讓大家更瞭解詳細規格的差異。先來幾張 LinkStation HG 美美的照片。(照片參考自 Mobile01,Ryan Lai 的大作,該文也是相當詳盡的介紹)

LinkStation 的「英姿」,看得到正面的開關按鈕、鏡面面版和 USB Port

從上向下的俯瞰照

LinkStation 的屁屁照。從上而下是風扇、重置鈕、GbE Port、USB Port 和電源插座。

在開始之前,先大概講一下有那些版本。撇開內建硬碟空間大小不談,除了 LinkStation 之外,日本還有另外一個產品叫做 Kurobox,規格和架構 LinkStation 幾乎一樣,只要的差異在它銷售的時候不像 Bufallo 一樣會強制內建一個硬碟,Kurobox 擺明了就是改機專用的網路外接盒,手邊有任何可用的硬碟都可以拿來用。反之 LinkStation 有內建硬碟,但是一旦你想拆殼換硬碟,一年保固就沒有囉!這樣說來 Kurobox 比較好用,但是我最後選擇 LinkStation 有兩個原因,第一,Buffalo 的產品比較好買,Kurobox 要請平行輸入的人帶才有辦法,第二,Buffalo 含硬碟的銷售比單買一個 Kurobox 外接盒划算很多(也可能是因為要平行輸入的關係),加上我手邊也沒有大硬碟,所以就買 LinkStation 囉!光就 LinkStation 來說台灣銷售也兩個版本(停售的就不說了),一個是標準 100M 網路介面的 LinkStation,另外一個是用 1 GbE 網路介面的 LinkStation HG (要從型號和規格來判斷,當然,不只是網路速度有差啦),而我買的是 HG 的版本,效能也比較快。最後,網路上還有最新最新的 LinkStation Pro,不過零售商架上我還沒看過(不過網購和官網都有),改機資源也沒有那麼多,所以規格再好也比較難吸引我。下面列一下我 LinkStation HG 的詳細硬體規格(我買容量是 160G,盒子裡內建是 WD1600BB,型號牌子就說不得準了):

CPU
266Mhz Freescale MPC8241 with MPC603e Motorola PowerPC core (PPC)
RAM
128MB ELPIDA DS2516APTA-75 SDRAM
ROM
4MB ST M29W320DT HG00
Net
10/100/1000Mb Realtek RTL8110S-32 PCI ethernet controller
USB
2.0 x 2 type A NEC D720101GJ (rear:/dev/usb/lp0, front:/dev/usb/lp1)
IDE
Silc0680acl144 OR IT8211 PCI IDE disk controller

然後補一張 LinkStation HG 脫光光主板照:

接下來是 LinkStation (V1 & V2), Kurobox, LinkStation HG, Kurobox HG, LinkStation Pro, Kurobox Pro 的混戰大比較:


LinkStation

Kurobox
LinkStation HG
Kurobox HG
LinkStaion Pro
Kurobox Pro
Model
HD-HLAN V1
HD-HLAN V2
KURO-BOX
HD-HGLAN
KURO-BOX/HG
LS-GL
KURO-BOX PRO
CPU
PowerPC
MIPS
PowerPC PowerPC PowerPC ARM9Core
ARM9Core
Clock
200MHz 400MHz 200MHz 266MHz 266MHz 400MHz 400MHz
RAM
64MB 64MB 64MB 128MB 128MB 128MB 128MB
ROM
4MB 4MB 4MB 4MB 4MB 4MB 256MB
USB
2.0 x 2
2.0 x 2 2.0 x 1
2.0 x 2 2.0 x 2 2.0 x 2 2.0 x 2
NET
10/100
10/100 10/100 10/100/1000 10/100/1000 10/100/1000 10/100/1000
Other





SATA
SATA + PCIe

從上面的比較表可以知道,只要 CPU 或周邊不一樣,改機用的韌體甚至軟體環境就會有差異,所以要認清楚自己用的硬體型號,並且找對了相對應的改機軟體和文章,才可以確保改機順利。此外,越高階、等級越好的機器代表如果拿來開個人伺服器,跑服務的效能應該也會更棒,但如果你需要這樣的裝置單純只是拿來做備份,或是網路硬碟空間共享的話,其實規格好壞差異就不大了(買最便宜的就夠了)。

入手 LinkStation HG 近一年來,發現市場價格和規格的波動非常小,這是小眾市場,價錢的抗跌性也比較好,要架設低耗電、安靜、有如此改機彈性的個人伺服器,除了弄一台 PC 之外,LinkStation 到現在都還是我覺得最好的選擇之一。

參考文章:
LS Hardware and Software information
Kurobox Hardware and Description
Mobile01: Buffalo LinkStation 家用網路硬碟機

2007-05-24

Bufallo LinkStation HG 改機前言

在玩過 Asus WL-500g 改機之後,覺得該硬體對於服務和儲存的需求有些不堪負荷,後來長期關注並勤做功課之後,終於入手了 Bufallo 的 LinkStation HG 160G。機器本身預設就是當作網路硬碟 (NAS, Network Attached Storage) 使用,對於大硬碟 (250G 以上)、網路存取 (Samba, FTP) 都有預設的支援和服務,運算能力和穩定性也相當不錯。不過如果搭配網路上網友們的 Hack,它不但強化了分享的能力,更能進一步轉型成個人伺服器使用。和我在 Hack Asus WL-500g 一樣,我也是借助了很多網友整理的文件和說明,一步一步地修改和改裝我的 LinkStation,讓它變成一台強大的個人伺服器。

改機資訊其實在 wyw 的 Kurobox/Linkstation 資訊討論區有很多的資源,站長也有整理相當完整的 PDF 文件,我也是參考這些文件進行改機的,只不過根據我自己的小小意見和經驗有做一些修改和註解,並且用我的 Blog 做一些整理,一方面自己反覆改機的時候可以當筆記來查詢,另一方面也可以分享給大家參考。再強調一次,大部分 Hack 的技術都是引用或參考各位網友強者的網頁和文章,我會詳細標註參考的來源和作者,內容雖然都會用自己的方式改寫,但是還是要尊重原作者的智慧。同樣的,這只是筆記,不會涉及太多基本觀念的介紹,這部份可以參閱鳥哥的 Linux 教學網站,或是 Debian 的中文討論區 (摩托學園),上面都有很多比我強 N 倍的神人可以傳授和解答。所有 Hack 的流程和內容大致包含:

  1. LinkStation HG 硬體規格剖析
  2. LinkStation 改機之韌體更新
  3. Debian 的安裝與設定 () ()
  4. Samba Server 網路芳鄰共享的設定
  5. AMP (Apache + MySQL + PHP) 的安裝設定
  6. FTP Server 的安裝設定 (vsftpd & proftpd)
  7. MLDonkey - 萬用 P2P 下載工具 (eMule, BT)
  8. LinkStation 的升級 Part1: 更換硬碟
  9. LinkStation 的升級 Part2: 支援 SATA 硬碟
  10. LinkStation 起死回生 via JTAG

以上大部分是參考 wyw 大大的改機文件,其餘的部分有的是其他網友的心得,加上我實際的經驗匯總起來的,如果有文章完成或新增標題,本文也會持續更新(不過不一定照順序喔)。這台個人伺服器上面可以玩的東西比 Asus WL-500g 多很多,只要不是把目標放在開大站,機器應該都還負擔得動。

整理這些文件主要的目的其實是方便自己查詢和記憶使用,我並不是什麼 Linux 強者、也沒能力去做更複雜或深入的改機,如果有什麼建議或問題可以一起討論,有其他心得可以分享更是歡迎。關於 LinkStation 的資源除了上面提到的中文 Kurobox/Linkstation 資訊討論區之外,還有國外的 Buffalo @ NAS-Central Wiki (很多圖片和規格從那邊來的),有時候很多問題可以在那邊找到答案,改機這條路雖然有趣,但是更多的部分要靠自己學習和摸索,如果只是沒由地亂問、或是像小白問些沒唸過書的問題,可能就沒人會理你囉!

回應: 4

 

2007-05-16

其他應用程式補完

在 Asus WL-500g 裡面提供的網路連線及相關工具其實不多,在此整理一些我安裝的工具和服務,大多不需要什麼設定,裝完就可以用了。

  1. FTP client: ncftp
  2. 如果你要抓檔案到 Router 來,除了用之前 Samba 的網路芳鄰分享之外,好像就沒有其他辦法。偏偏因為硬體的限制如果大一點的檔案編輯器就沒辦法處理,有些檔案只好在外面編輯後放進來。結果內建的韌體連 FTP 都沒有,只好自己裝。我裝的是我常用的 NcFTP (v3.2.0-2):

    ipkg install ncftp

    裝完以後執行檔會被複製到 /opt/bin 下面。現在你就有工具可以 ftp 出去抓檔了。用法:

    ncftp -u user [-p password] [-P port] host-ip/domain

    嫌這樣太麻煩,也可以自己建立站台列表(bookmark),以後連線也比較方便。

  3. WWW client: Lynx
  4. 文字模式要怎麼測試某個網站能不能連?用 Ping 的不一定準,因為有可能中間是因為 Proxy 的問題或對方關掉 Ping port,最直接的辦法還是用 Web client 連過去看看。文字模式還有 Web browser ?沒錯,這就是我常常用來測試 Web 的 Lynx。重點並不是能不能看到完整網頁,而是該網站連不連得上。安裝 (v2.8.6-1, 還會被裝上 bzip2 v1.0.4-1 & openssl v0.9.7m-1 & zlib v1.2.3-3):

    ipkg install lynx

    裝完以後執行檔同樣放在 /opt/bin 下面。用法和一般瀏覽器一樣,後面帶網址就好了:

    lynx http://domain-name:port

  5. 進階編輯器: Joe
  6. 說到 Joe 很多人應該很熟悉吧,編寫 code 的時候可以有顏色區隔,編寫時還會自動備份。安裝:

    ipkg install joe

    這樣會安裝 Joe (3.5-1) 以及所需的 termcap (1.3.1-2)。

  7. 簡單的資料庫: SQLite
  8. 之前有試過安裝 mySQL (4.1.20-1),裝是裝好了,還裝了一堆相依的套件,但每次跑每次都 ERROR,後來也體恤也許 mySQL 對 Asus WL-500g 太沈重,放棄!最後改裝 SQLite (3.3.16-1),沒想到一裝就裝好了:

    ipkg install sqlite

    看來好像還有一個叫 sqlite2 的,不過看版本還是裝 sqlite 比較保險。這是一個類似 Access 的資料庫軟體,功能很精簡,不像 mySQL 那麼強大(複雜),只要指定一個資料庫檔案就可以執行了:

    sqlite3 test.db

    進去之後和 mySQL 很像有提示符號 sqlite>,用 .help 可以列出所有操作的指令,一開始不知道從哪裡開始嗎?可以參照這篇文章

  9. ZIP 檔解壓縮工具: Unzip
  10. 韌體裡面已經內建了 tar 和 gzip  & gunzip 這些封裝和檔案壓縮工具,tar 也可以結合 gzip 一起做檔案的解壓縮 (tar -xvf),但是,如果你抓到一個附檔名是 .zip 的檔案,這兩個工具竟然是沒辦法處理?!所以,要另外裝 Unzip 來處理在 PC 上再常見不過的壓縮檔。

    ipkg install unzip

    這裡安裝的是 v5.52-1,用法很簡單:

    unzip 檔名.zip

  11. 網卡流量檢測工具: nload
  12. 想知道現在 router 對內對外的流量狀況嗎?nload 是一個能夠即時回報網路狀況的公用程式,只要指定介面,就會立即顯示該網路介面的動態。安裝:

    ipkg install nload

    使用時只要指定網路介面當參數。假設想看 500g 整個對內對外的總流量狀況,要指定看 eth1 介面的狀況(無線網路是 eth2):

    nload eth1

    就可以有詳細的數據統計。由於是即時動態監控,如果不看了,可以按 q 或 Ctrl+c 離開。

  13. USB 裝置檢查: USB utility
  14. 想知道自己的 USB 裝置插上 Wl500g 之後,倒底有沒有被認到,還是沒插好嗎?除了用 dmesg 來找,也可以安裝一個小公用程式;

    ipkg install usbutils

    以後要檢查 USB,包含 ID 和裝置的狀況,用命令 lsusb 就可以了。

  15. 不用資料庫的 Wiki: DokuWiki
  16. 官方網站在這裡。(還沒裝過)

  17. 不需資料庫的 Blog 系統: Simple PHP Blog
  18. 官方網站在這裡

  19. 精簡的討論區: PunBBS(可以用 SQLite 資料庫)
  20. 官方網站在這裡。(還沒裝過)

以上工具程式對系統不會有什麼影響,不過如果是後面的幾項服務(Blog, Wiki, BBS),就要先準備好 PHP ready 的環境,並且評估開啟服務後對整個系統的影響,畢竟 WL-500g 只是一台虛弱的電腦,讓它做太多事他可能會容易生氣和罷工的喔!

[補充]
除了另外安裝公用程式,系統內也有一些程式命令可以用,以下做一點整理:

  1. dmesg
  2. 這個命令是用來顯示裝置的所有硬體資訊,有點像 Windows 的裝置管理員,只不過都是文字敘述,要自己捲頁去找詳細資訊,或帶 grep 參數列出自己想看的東西。舉例說明,如果想看 CPU 型號,可以用:(大小寫有差異)dmesg | grep CPU,記憶體除了用之前有提過的命令 free,也可以用 dmesg | grep Memory,最後如果想看「硬碟」的資訊(這裡指的是外接的 USB 隨身碟),則是用 dmesg | grep hd,它就會列出目前接在系統上的硬碟大小和 Volume 名稱。執行的範例和結果如下:

    # dmesg | grep CPU
    CPU revision is: 00024000
    CPU: BCM4710 rev 0 at 125 MHz
    # dmesg | grep Memory
    Memory: 13840k/16384k available (1799k kernel code, 2544k reserved, 248k data, 68k init, 0k highmem)
    # dmesg | grep hd
    SCSI device sda: 521152 512-byte hdwr sectors (267 MB)

  3. nvram
  4. NVRAM 是一個儲存設定的記憶空間,有時候會發現即使更新韌體,怎麼會之前做過的設定還在?主要是設定有另闢專區保存,即使韌體重灌也不會消失。所以像是撥接設定、DHCP 或預設原廠提供的參數,都是儲存在這裡。這個命令是用來看 NVRAM 裡面的設定狀況,當然,也可以去更改它。如果要顯示所有現在的設定參數,用下面的命令:

    nvram show

    每行顯示的格式大概是「參數名稱=參數內容」,當然你也可以單看某個參數,指定「參數名稱」就行了。假設你想查看 Web 管理的 Port (http_lanport),命令是:

    nvram get http_lanport

    預設是 80,所以應該會看到「參數的內容」。如果想更改,一樣給定參數名稱,再指定參數內容就行了。假設我想把 80 改成 8080,命令如下:

    nvram set http_lanport=8080

    這樣改完,相當於網頁介面的 Apply 套用,不過下次開機可能就不見了,要保存設置,要另外下:

    nvram commit

    很多設定要重新開機才看得出效果,所以再手動 reboot 就好了。這個命令基本上就和透過網頁對 wl500g 做設定一模一樣,只不過是用命令模式,如果想備份設定,也可以把 nvram show 的結果保存起來,做未來 recover 使用。

回應: 5

 

2007-05-04

更新 Asus WL-500g 的系統 C Library: uClibc

其實 Hack 完 WL-500g 後,玩了一陣子發現會影響網路效能(甚至當機),後來還是回歸自然,讓它單純只做網路設備的工作,系統就很穩定地在運作中。不過不定期還是會看一看 Oleg 大大是不是又釋出新版 Firmware、又加了什麼新功能、解了什麼 bug,有空忍不住還還是會想去更新一下。適逢 1.9.2.7g於四月份釋出,我又打算「升級」之際,撇見一位匿名的熱心網友提醒,原來核心使用的 C Library 有了新版,而且號稱支援更多的軟體服務、能讓系統更穩定,趁著這次更新韌體,我就一併把這個 C Library 安裝和更新吧!

由於這個 Library 相當底層,所以如果你不是重裝系統,官方網頁建議你安裝完 uClibc 之後應該 re-install 你所有安裝過的服務(這樣,不會有問題吧),才能確保所有應用程式的穩定程度。對我來說這種「升級」的動作問題通常都很多,算了,我還是一整個重來吧(反正我有 Hack 文件整理在這個 Blog 上)。其實,安裝 Library 的動作對未來要裝其他應用程式在動作上沒有影響,不過在順序上,一定要在安裝任何應用程式之前,所以我整理過的文章會影響的部分,只有這篇:「基本環境的設定 - ipkg & post-boot」,因為我要用「更新版」的 ipkg、並且更改未來其他安裝軟體下載的 ipkg 網址,這樣才能確保未來安裝的應用程式都是用到新的 uClibc Library。變更的部分,從安裝 ipkg 開始,本來是執行:

ipkg.sh update
ipkg.sh install ipkg

改(記得前幾個步驟暫存目錄還是要建立)!我們手動下載比 Oleg 1.9.2.7g 更新版的 ipkg (0.99.149-2 -> 0.99.163-9),並且安裝:

wget http://ipkg.nslu2-linux.org/feeds/optware/oleg/cross/stable/ipkg-opt_0.99.163-9_mipsel.ipk
ipkg.sh install ipkg-opt_0.99.163-9_mipsel.ipk

後面那個安裝的步驟會有一些錯誤訊息,可以忽略它。接下來手動下載 uClibc (uClibc-opt 0.9.28-12),並且安裝:

wget http://ipkg.nslu2-linux.org/feeds/optware/oleg/cross/stable/uclibc-opt_0.9.28-12_mipsel.ipk
ipkg.sh install uclibc-opt_0.9.28-12_mipsel.ipk

同樣的,安裝過程會有錯誤訊息,一樣不用管它。原則上這樣就都裝好了,有了新版 ipkg 和 Library,系統應該就是升級完成,但是,我怎麼確保未來下載安裝的 package 都是支援 uClibc 的軟體和服務呢?這個時候,應該更改 ipkg 去更新、下載軟體的預設網址囉!要修改設定檔,這時候系統應該沒有像樣的編輯器,所以不得以還是先更新一下 package list:

ipkg update

然後安裝 nano 這個編輯器 (2.0.4-1,會一併被安裝 ncurses 5.6-1):

ipkg install nano

好,有了編輯器,我們才能去編輯 ipkg 的設定檔:

nano /opt/etc/ipkg.conf

找到裡面有一行:src/gz native http://ipkg.nslu2-linux.org/feeds/optware/oleg/native/stable,remark 這一行(在這行最前面加一個 #),然後補下面這一行:

src/gz optware http://ipkg.nslu2-linux.org/feeds/optware/oleg/cross/stable

意思就是請到這個目錄下檢查和下載可以用(for uClibc)的應用程式,並確定最後一行是:

dest root /

存檔離開,然後記得再更新 (ipkg update) 一次 package list,確保抓回來的 List 是最後版本就好了。到此裝好了 ipkg, uClibc 和 nano,請繼續這篇文章從建立/修改開機設定檔 (/usr/local/sbin/post-boot) 這個步驟做下去、設定完防火牆 (/usr/local/sbin/post-firewall)、更新 flash 重新開機,不但就完成了基本環境的設定,也一併安裝了最新的 C Library 囉!後面其他軟體和應用程式的安裝設定基本上都沒有影響,可以 follow 我其他 Asus WL-500g 的 Hack 文章繼續做下去~至於系統有沒有比較穩、應用程式有沒有比較多,我就懶得實際去測試和比較了,實際又遇到什麼狀況我再更新吧!

參考文章:
(我自己的) 基本環境的設定 - ipkg & post-boot
Optware-uClibcBuild

回應: 8

 

2007-04-03

Asus WL-500g 硬體規格剖析

之前整理了很多關於自己的 Asus WL-500g 改機的文章,不過發現竟然沒有整理到關於硬體的資訊,臨時想找還找不到,所以趁這個機會把硬體的部分補齊。其實 500g 老早就已經消失 Face Out 了,大多市面上還看得到的,都是改版過的新型號,500g 系列(包含 500g, 500gx / Deluxe, 550gE 到現在最後的 500gp / Premium)的產品還挺多的,也因為核心架構都一樣,因此改機韌體部分也是大同小異,主要越新的型號硬體效能越好罷了~像是 500g 的豪華版 500g Deluxe,雖然拿掉了 Printer Port,但是多了一個 USB(還升級到 2.0)、CPU 變快(125MHz 到 200)、記憶體加倍(16MB 變成 32MB),整體上改機跑軟體的效能應該會越來越好才是。

回到重點,本文要記錄的 500g 的硬體,外觀上 500g 還蠻大的、全塑料銀色外殼,有直立支架可平擺或直放,整理幾張外觀的照片如下:

WL-500g 正上方和底面的照片

WL-500g 面版燈號一覽,還有屁屁的照片(這是 Deluxe,標準 500g 只有一個 USB,但有 Printer Port)

最後一張是 500g 直立的擺法

接著來看硬體規格。因為用的是 Broadcom MIPS CPU,因此坊間給 PowerPC 或 Intel CPU 用的 Linux Kernel 都不能用,所幸還是有人(像 Oleg 大大)去修改韌體原始碼,或是套用 OpenWRT 這套 Embedded Linux 來改機,並且有不少在這些環境的應用程式被人 Porting 出來,讓改機後有更多軟體可以安裝使用。這台 Router 本身就是台小電腦,因為還有 USB 在上面,因此可以拿來接 USB 隨身碟、印表機、WebCam 甚至 USB 音效裝置!只要有相對應的驅動程式,就像在電腦上使用 USB 周邊一樣有彈性。由於我的舊版 500g 只有一個 USB 1.1 接頭,所以我只能拿來插 USB 隨身碟擴充主機的儲存空間(而且還很慢),後來實測軟體發現硬體好像頂不住,為了穩定因此也不敢裝太多服務和軟體,乖乖做好 Router 和防火牆比較重要。硬體規格如下:

CPU
125 Mhz Boardcom BCM4702 (mipsel)
RAM
16 MB
ROM
4 MB Flash
Net
Ethernet 10/100M RJ45 x 5 (WAN x 1 + LAN x 4)
Wifi 802.11b/g 11/54M
Peripheral
Parallel x 1 + USB 1.1 x 1


接下來補一張 500g 脫光光的主板照片:

其實這個玩意是我當初辦 So-net 的贈品,發現可以改機真的是「天上掉下來的禮物」,除了我操爆它裝太多軟體服務之外(會當掉都是我亂玩),長久以來還算是蠻穩定的,包括現在換成了 10M/2M 的 FTTB 光纖網路,沒事自己搬東西下載或是提供全速讓人家下載,這台 Router 還是任勞任怨地努力工作,雖然有時候我還是嫌它太老(USB 太慢又不夠用、硬體不夠強不能跑軟體、又沒有 GbE 介面),也考慮把它換掉,但是像這樣能改機的 Router 實在太少了,應付我目前的使用還綽綽有餘(還有亂改的樂趣),所以就一直用到現在。不過也因為漸漸消失在市場上,相關的討論和資料越來越少,因此才整理一系列的文章試圖保留下來,不管是自己用還是分享給別人,應該都會有點幫助吧!

回應: 11

 

2007-03-20

標籤/搜尋頁面只列出標題 (Simplify the result of label and search)

Blogger 首頁允許你設定最多顯示的文章數量,但是,其他的地方就不一定了。像是標籤、搜尋、網頁存檔等等匯總的頁面,文章一多一點進去,嘩啦一狗票的文章就通通連內文一併列出來,預設最多會出來 20 篇左右,但如果是歷史文章存檔的匯總,搞不好上限是 999,那通通都列出來還得了!因此,我們可能希望當點到標籤、列出搜尋結果或是歷史文章存檔,可以只列出時間和標題,有需要詳細內容的再點進去觀看。

這類的 Hack 很簡單也很普遍,後面的參考文章也都有提,但是我的需求有一點點不一樣,我「只」希望在標籤和搜尋頁面列出標題,但是在存檔頁面 (Archive) 裡面還是像首頁列出原文(不然,我做那麼多「繼續閱讀」的 Hack 效果只出現在首頁也浪費了),根據我之前的文章介紹 Blogger 內的四種頁面判斷句,也做了一點點修改。Hack 的第一個步驟,同樣是編輯範本的完整 HTML(要展開小裝置範本),找到下面的這一段(如果你裝過其他 Hack,可能不是長這樣,不過,關鍵是紅色那一行):

<b:loop values='data:posts' var='post'>
  <b:if cond='data:post.dateHeader'>
    <h2 class='date-header'><data:post.dateHeader/></h2>
  </b:if>
  <b:include data='post' name='post'/>
  <b:if cond='data:blog.pageType == "item"'>
    <b:if cond='data:post.allowComments'>
      <b:include data='post' name='comments'/>
    </b:if>
  </b:if>
</b:loop>

解釋一下,這是樣版用來「列出文章」用的範本,「任何」一種狀況下適用,那段 date-header 的是列出日期,而紅色那一行的意思就是「列出全文」。我們要動的手腳正是:「只在某些條件下列出原文,其他情況,列出標題就好」,這樣的修改,只要把下面這一段判斷取代掉上述紅色的那一行即可:

<b:if cond='data:blog.homepageUrl != data:blog.url'>
  <b:if cond='data:blog.pageType == "index"'>
    <!-- Show article title only -->
    <h3 class='post-title'><a expr:href='data:post.url'><data:post.title/></a></h3>
  <b:else/>
    <b:include data='post' name='post'/>
  </b:if>
<b:else/>
  <b:include data='post' name='post'/>
</b:if>

上面這一段的意思是:當現在所在的頁面「不是首頁」,而且,PageType 為 index (標籤/搜尋) 的時候,只列出文章的標題,否則,維持原樣列出完整內文。好!這樣就改好了!(很簡單吧!)如果你是想改的是「除了首頁」以外的頁面都只列出標題(也就是存檔頁面也要只列出標題),那麼可以把上面那段的第二行改成:

<b:if cond='data:blog.pageType != "item"'>

這樣就是:當現在所在頁面「不是首頁」,而且也「不是單篇文章的內文」時,就通通只列標題。

此外,其實這個 Hack 還有很多變化型,可以更動「只列出標題」頁面的樣式,像是「只列出標題卻不含日期」(那你要把上面 date-header 列出日期那段也塞入判斷句裡),或是更改 <h3 class='post-title'> 的 CSS。如果你也有用到我 Comment Toggling 的 Hack,那麼建議你關於 Comment: <b:if cond='data:post.allowComments'> 那三行最好也塞入判斷句裡去,這樣原始碼也會比較簡潔。

本來想偷懶不寫這一篇,因為自己的樣版已經不夠「標準」了,要怎麼 Hack 有點忘了,不過剛好有網友再問,所以還是依照我參考的原文,還有自己的一點點心得,整理了這一篇。

參考文章:
Blog工事紀實-進入標籤頁面後只顯示文章標題
Blogger-Beta Hack之“简洁的搜索/标签结果”

回應: 69

 

2007-03-12

移除連結的虛線外框 (Remove the link outline)

不知道什麼時候開始,在瀏覽器上,當點到某些連結的時候,總會有個虛線外框在上面,尤其在我黑色的 Blog 樣版上格外明顯,一直以來都很礙眼。這兩天剛好看到一篇文章,解決了我長久以來的疑惑,原來這也是 CSS 屬性的一部份啊!雖然這個變數名稱很怪,而且不同瀏覽器還都不一樣,不過經測試,果然徹底的解決了這個問題,順手就寫篇文章記下來。

所謂連結的虛線外框就是像這樣,括在「發表時間」的外面:

怎麼拿掉呢?只要你在定義的 CSS 裡面,對基本標籤 <A> (標註連結用的)做樣式 Style 宣告做修改就好了,在自己網頁的 CSS 宣告區段(在 Blogger 裡面,就是範本 </head> 標籤前,一堆定義 ID & Class 的地方),放入下面這些 CSS Code(如果不是放在區段內的獨立宣告,記得以下整段要加上 style 的標籤前後括起來):

/* Remove the link outline */
a {
  noFocusLine:expression(this.onFocus=this.blur());
} /* For IE */
:focus {
  -moz-outline-style: none;
} /* For Firefox */

如果只想對一個連結這麼做,則只要在 <A> 標籤內設定屬性,範例如下(紅色的部分為屬性):

<a href="http://www.google.com" hidefocus="true">Google</a>

說實話我從來沒看過這些屬性和樣式變數,不過既然有用,當然就套用囉!這個 CSS Code 適用於各種瀏覽器、網頁文章和系統。

參考文章:
[CSS]hideFocus Property

回應: 2