網頁

2014年2月7日 星期五

QNAP QPKG開發經驗

last update:2015/02/10

前一陣子在忙的整合,只是因為很懶才現在寫出來
老實說也是近期我才知道NAS這東西究竟能做什麼
剛好有一家客戶是用Synology的產品跑Ragic
而QNAP也找上門來談合作
這樣就把台灣前兩大的NAS廠的東西都摸過啦(註:也是世界前兩大)

我個人認為NAS適用於完全都不懂的新手或玩Linux及程式很熟的IT使用者
新手就不用考慮有的沒的需求,看平台提供什麼樣的服務就使用那些服務
如果想藉NAS做到特定需求,得要有些能力才能夠建置完成

對於這兩家的NAS硬體部分沒有研究,這部分就不提
以目前接觸過這兩家的產品的軟體面來說,我覺得QNAP的方向是對的
而QPKG就是把各家程式包裝成QNAP自家格式的 App 讓使用者能夠輕易安裝
他們的介面對於一般使用者會是比較親切的作法

NAS底層的OS是廠商各自開發的Linux distribution
執行Linux指令時,很容易遇到部分指令被移掉或權限控管等情況
如果不是內部人員還真不知道到底哪邊踩到雷
而我在Synology的產品還遇過不太愉快的Linux執行的雷
上網發現這個問題在他們的論壇也有反映過...
在QNAP也碰過安裝他們提供的JVM QPKG一直失敗
後來才發現他們的App Center提供的是ARM版本,而我用的是X86的NAS
這個問題也是上網看才發現有不少使用者碰到同樣問題而上網求救
所以我個人認為如果對於NAS不熟,那就乖乖使用內部功能而不要想其他的
當然QNAP的X86版本的JVM目前在App Center上提供的已經是正確版本,這點至少可以安心

QNAP的開發可以參考他們的一份文件
要開發QPKG,首先你可以參考簡報先安裝QNAP的開發工具QDK
之後可以透過Putty之類的 command line 工具下指令
這邊提一點QNAP家的預設帳密是 admin / admin
很多人買了NAS回來後都沒再改密碼的,為了安全性建議還是得改

首先要碰的指令為
1. ln -s /bin/sh /bin/bash
2. cd `getcfg QDK Install_Path -f /etc/config/qpkg.conf`
3. qbuild --create-env  [QPKG_Name]

第一個指令是製作Symbolic Links,讓 sh 指令正常運作
NAS還沒設定過的話,會需要執行此指令一次,之後就不需要再次執行了

第二個指令(`/sbin/getcfg $QPKG_NAME Install_Path -f $CONF`)會切換到QDK的路徑
如果你需要切換到其他QPKG的安裝目錄時,也會需要這個指令
QDK的安裝路徑在我使用的NAS型號會是 /share/HDA_DATA/.qpkg/QDK
這個路徑會因NAS型號不同有有所差異

qbuild --create-env 指令會在這個目錄下幫你建立好你的QPKG開發目錄
接著cd移動到開發目錄  /share/HDA_DATA/.qpkg/QDK/[QPKG_Name]

Windows環境下,我還是比較習慣用GUI介面來操作
所以我會透過FTP軟體上傳及更新QPKG的檔案,請記得連線時設定SFTP連線
如果不想這麼做的話

NAS的公開目錄下製作一個 Symbolic Links 連結你QPKG目錄的資料夾也是可以

接著繼續進行開發流程的說明
首先編輯開發目錄下的qpkg.cfg
有一些設定必須在這裡指定

QPKG_NAME="Ragic"
QPKG_VER="0.1"
QPKG_AUTHOR="vencil"

以上3項會在App Center裡會顯示,算是必設的項目
另外有些項目依照需求設定

QPKG_SUMMARY   可以設定程式簡介,不過這只有開發人員看的到
QPKG_REQUIRE       你可以指定JRE或是Python等你需要的環境
QPKG_WEB_PORT   設定你的程式的使用Port
QDK_DATA_DIR_ICONS  指定icon目錄位置

icon的目錄預設為開發目錄的/icons路徑
會需要至少3個Gif格式的icon,命名規則得依照其內部規定來
[QPKG_Name].gif           在一般畫面看到的icon,可以略大於 80 x 80
[QPKG_Name]_80.gif     App Center上看到的icon,大小是 80 x 80
[QPKG_Name]_grey.gif  在app停用時用來顯示的灰色圖案,內容基本同 _80.gif

接著設定同目錄底下的 package_routines
package_routines可以設定安裝、移除過程中需要執行的指令
如果你的程式執行上較單純,不需要仰賴NAS自帶的Apache也不需要備份資料的話
可以省略這個步驟讓NAS自行處裡

修改 package_routines 時可以考慮加入以下內容

CMD_CP="/bin/cp"
CMD_CUT="/bin/cut"
CMD_GETCFG="/sbin/getcfg"
CMD_LN="/bin/ln"
CMD_MV="/bin/mv"
CMD_RM="/bin/rm"
CMD_SED="/bin/sed"
CMD_SETCFG="/sbin/setcfg"
SYS_CONFIG_DIR="/etc/config"
SYS_QPKG_CONFIG_FILE="$SYS_CONFIG_DIR/qpkg.conf"
SYS_QPKG_CONF_FIELD_INSTALL_PATH="Install_Path"
SYS_QPKG_SERVICE_ENABLED="TRUE"

像CMD_CP這一類的設定是因為底層的Linux指令(如cp、rm)預設是不開放的
接著編輯在QPKG完成後要執行的行為、移除後要進行的行為
如果你的程式需要掛在NAS本身的Apache,還得多寫一些設定
檔案本身也得掛到/share/Web/這個目錄下

Ragic本身就有自帶web container,以及本身就是資料庫
所以還不需要撰寫跟Apache相關的指令
只是目前QNAP對於App的update機制還沒有統一
目前的做法等同於砍掉後重裝
所以得在PKG_PRE_REMOVE、pkg_post_install增加處理
才不會在update後原本的資料的沒有留下
有類似需求的可以參考以下作法
PKG_PRE_REMOVE="{
  CONF=/etc/config/qpkg.conf
  QPKG_NAME="Ragic"
  QPKG_ROOT=`/sbin/getcfg $QPKG_NAME Install_Path -f $CONF`/../

  $CMD_MKDIR -p "$QPKG_ROOT"Ragic_data
  $CMD_CP -r "$QPKG_ROOT"Ragic/xxx  "$QPKG_ROOT"Ragic_data
}"

pkg_post_install(){
        CONF=/etc/config/qpkg.conf
QPKG_NAME="Ragic"
QPKG_ROOT=`/sbin/getcfg $QPKG_NAME Install_Path -f $CONF`/../

if [ -r "$QPKG_ROOT"Ragic_data ]; then
$CMD_CP -r "$QPKG_ROOT"Ragic_data  "$QPKG_ROOT"Ragic/xxx
$CMD_RM -rf "$QPKG_ROOT"Ragic_data
fi
}

最後一個需要調整的項目是 開發目錄/share下的 [QPKG_Name].sh
依照此文件裡的指示增加 啟動/停止時需要執行的Linux指令

有用到script的部分建議如果能得到QNAP人員的協助會更好
因為這滿難Debug,所以採到雷會比較難解決

安裝後你可以在NAS的 /share/HDA_DATA/.qpkg/[QPKG_Name]找到從這裡複製過去的程式

當你的程式放置在 /share,設定也調整完後,接著要做的就是打包QPKG
在開發目錄下 qbuild 指令開始執行compile,包裝後的檔案會放在 開發目錄/build
以後要調整,就變更放在 /share下的程式內容後再build一次就好了

2 則留言:

  1. 偷問一下,
    怎麼會玩到NAS啊?

    回覆刪除
    回覆
    1. 喔,原因就跟開頭寫的一樣
      Synology是有客戶想用NAS當私有主機跑我們家的產品
      QNAP則是在找願意跟他們做二次開發的協力廠商

      刪除