2013/01/09

shpkg 自製網樂通套件管理(套件數:9012以上)

[2013/11/05 更新]
網樂通雖然有內建的 opkg, 但是已經沒有人幫它封裝套件了. 所以,試看看從 STLinux 2.3 安裝套件. 開發了一個約 750 行的 bash script, 可用於安裝 STLinux/Fedora 套件, 也可自製套件放進去。免責說明: 使用前自行備份, 不確定不會毀損系統, 2013/06/27 fedora 套件回來了, 該網站又提供下載了, 使用方式請自行調整 /etc/shpkg.conf 將 fedora 那兩行開頭的 # 註解移除即可.
自 sh4twbox 0.8 以後,採用 shpkg 新版(以dash開發, 1046行)
shpkg 運作原理是將STLinux 官方網站的套件的 rpm 解開, 調整目錄後, 放到網樂通裡面, 目前也引入 fedora sh4 套件, 也是直接解開並不處理 rpm 內部的 scripts.

shpkg 2013xxx 版 適用於 stlinux 2.4 編譯套件 (sh4twbox 0.7~)
shpkg 13xxx 版 適用於 stlinux 2.3 編譯套件 (sh4twbox 0.5~0.6.2)

shpkg 有兩個不同平台版本, 下載網址
  1. shpkg-st 用來放在網樂通內部,多了個虛擬目錄, 將 STLinux 的檔案轉到根目錄安裝
  2. shpkg 用來放在各平台(比方說交互編譯的PC), 可以安裝 STLinux 套件到 /opt/STM... 目錄
    1. 在 PC 上使用 shpkg 安裝 STLinux 的 rpm 套件要以 -Sd 選項忽略相依性安裝, 以下幾個套件則無法直接安裝
      1. stlinux23-host-stworkbench
      2. stlinux23-sh4-filesystem # error on real rpm cpio failed
      3. stlinux23-sh4-Maelstrom # error on real rpm -ltt-control
      4. stlinux23-sh4-makedev # may useless because don't making devices

安裝方式

  1. 已安裝 sh4twbox 者
    1. shpkg -Syu 即可升級 shpkg-st 套件, 或手動強迫重裝 shpkg -Sy shpkg-st
  2. 未安裝 sh4twbox 者
    1. 以本站編的 busybox 替換舊版busybox (需要 bash>=3.0 wget awk tar rpm)已安裝 sh4twbox 者此步驟可省略.
    2. 下載 shpkg-st-<version>.txz 放到網樂通主機後, 安裝方式: 
    3. cd /
    4. xzcat shpkg.<version>.txz | tar xf -
    5. tar xf  shpkg.<version>.txz  # 較方便的語法, 限 busybox 1.20.2 以上版本

使用方式: 

  1. shpkg  # 顯示語法說明
  2. shpkg -Sy # 從網站更新套件列表
  3. shpkg -Syu # 系統升級
  4. shpkg -Sl # 列出所有提供的套件
  5. shpkg -Sl sh4twbox # 列出本站封裝好的套件
  6. shpkg -SEs filesystem # 快速搜尋名稱中有 filesystem 字樣的套件
  7. shpkg -Ss filesystem # 搜尋名稱中有 filesystem 字樣的套件
    • st23sh4 stlinux23-sh4-filesystem 1.0-14.sh4 # 格式為 <server> <名稱> <版號>
  8. shpkg -St stlinux23-sh4-filesystem # 安裝前先看一下會裝哪些檔案
    1. ls /var/cache/shpkg/pkg/stlinux23-sh4-filesystem* # 套件檔暫存於此, 覺得不妥, 可以自己手動解壓縮
  9. shpkg -S shpkg-st # 重新安裝之前本站封裝的 shpkg 套件覆蓋原先手動安裝的, 這樣才會有套件版號紀錄存在, 方便未來升級(注意: 在網樂通裡面應該用shpkg -S shpkg-st)
  10. shpkg -E  # 自動找系統內的執行檔缺少之動態連結檔(.so) 
    1. 此功能為人工提供相依性套件列表安裝, 仍需網友協助校正增補
    2. 若找到套件安裝後, 可能新的套件還需要再執行 shpkg -E 再找相依性
    3. 若還是不能運作, 請參考 wiki 網頁看看網友提供的修正方式
    4. 若發現要求重複安裝已安裝套件的訊息, 則需安裝相關套件, 舉例如下:
      shpkg -S stlinux23-sh4-ppp
      shpkg -E # 出現安裝 stlinux23-sh4-libpcap-dev 訊息, 按 Enter 安裝
      shpkg -E # 又出現安裝 stlinux23-sh4-libpcap-dev
      ** 20:38:03 generating .so file listing
      /usr/sbin/pppd libpcap.so   這行訊息代表需要.so 的執行檔
      以 ldd /usr/sbin/pppd 可以看到確實沒有找到 libpcap.so
      其實 /usr/sbin/libpcap.so 存在, 但是指向未安裝的 libpcap.so.0.9.8
      shpkg -S stlinux23-sh4-libpcap # 因此安裝相關套件(去掉 -dev 或是 -devel)
  11. shpkg -E <執行檔名>  # 自動將執行檔沒安裝 .so 的找出對應套件
  12. shpkg -SE <套件名稱> # 自動安裝套件及其相依套件
  13. 使用 wget 替代 busybox 的 wget 希望使下載更穩定
    1. shpkg -SEs glibc # 找出套件名稱, eg. stlinux24-sh4-glibc
    2. shpkg -S stlinux24-sh4-glibc
    3. shpkg -SEs wget # 使用較好的 wget (非 busybox 版)
    4. shpkg -S stlinux24-sh4-wget
    5. rm /bin/wget # 因為內定 PATH 優先順序 /bin 優先其次才是 /usr/bin
    6. wget # 此時若出現 -bash: /bin/wget: No such file or directory
      1. hash wget # 重新讓 bash 對應 wget 到 /usr/bin/wget
  14. shpkg -R xxx # 移除套件
  15. shpkg -U xxx.txz # 強迫更新套件(適用於新版套件有問題, 換回舊版)
  16. shpkg -Scc # 清除下載暫存的套件檔案空間
  17. 實際安裝案例參考sh4twbox 0.7 以後範例網頁0.5~0.6.2 範例網頁

進階配置

  1. 可編寫 /etc/shpkg.conf 將自己的 mirror 網站放在前面, 這樣就可以優先下載自己 mirror 檔案,例如:
    sh4twbox txz http://sh4twbox.googlecode.com/files \        http://localhost:8000/mirror/sh4twbox \        http://sh4twbox.googlecode.com/files
  2. 找類似函式庫的方法, 比方說你裝了最新版的 readline(提供usr/lib/libreadline.so.6.2), 而有些程式需要舊版的 libreadline.so.5,
    ln -s /usr/lib/libreadline.so.6.2 /usr/lib/libreadline.so.5 # 直接以新版試看看
    xzgrep libhistory /var/lib/shpkg/sync/*solist*  # 若不行再查看看有沒有版本一致的
    安裝該版本套件(較安全的方法是解開該 so 檔, 只放該舊版 so)

封裝套件方式

  • 2013*版套件名稱規則
    • stlinux/fedora: <name>-<ver>-<rel>.<arch>.rpm
    • arch: <name>-<ver>-<rel>-<arch>.pkg.tar.xz
    • shpkg: <name>-<ver>-<rel>-<arch>.<ext> where <ext> maybe tar.gz,tgz,txz
    • where <ver> start from a number and can not contain '-'
    • <arch> maybe one of all,noarch,any,i686,x86_64,arm,sh4,src,nosrc
    • <name> start from a alphabet
    • <rel> start from number or r<number> or v<number>
  • 13*版(舊版)套件名稱規則 <英文>-<版號>-<包裝號>.<副檔名> 這裡的減號很重要, 用來區別套件名稱。若要編譯交互編譯函式庫, 檔名請取 stlinux23-sh4- 開頭,總共支援四種分段方式
    • <name>-<ver>.<ext>
    • <name>-<subname>-<ver>.<ext>
    • <name>-<subname>-<ver>-<rel>.<ext>
    • <name>-<subname>-<ver>-<rel>-<arch>.<ext>
  • 支援 rpm (僅簡單解開壓縮檔,放到根目錄,不會執行script)
  • 支援 txz (即 tar.xz 格式)
例如: 封裝 shpkg 的 script 如下(建議用 root 或 fakeroot 封裝,  uid,gid 才會正確)
 VERSION="20130112-2" rm -rf pkg mkdir -p pkg/{,usr,usr/bin,etc} cp shpkg pkg/usr/bin cp shpkg.release.conf pkg/etc/shpkg.conf fakeroot tar -C pkg -cJf shpkg-$VERSION.txz usr etc fakeroot tar -C pkg -czf shpkg-$VERSION.tgz usr etc mkdir -p pkg/opt/STM/STLinux-2.4/devkit/sh4 ln -s ../../../../.. pkg/opt/STM/STLinux-2.4/devkit/sh4/target fakeroot tar -C pkg -cJf shpkg-st-$VERSION.txz usr etc opt

2013*版自製套件列表方法如下:
ls *.txz | xz > sh4twbox.xz # repository name is sh4twbox

13*版(舊版)自製套件列表方法如下:
ls *.txz | awk '{ print "basename",$1,".txz"}' | sh | xz > sh4twbox.xz

封裝函式庫套件方式

以編譯 intltool 為例, 建議安裝目錄設定到 STLinux24 底下, 例如: mk_intool.sh

開發經驗談

約 1069 行 script, 目前自動測試有 57 個案例
  1. 函數盡量使用 local 變數宣告, 因為少宣告 local, 為了抓 bug, 花了3個小時
  2. 善用版本管理系統(推薦 fossil), 紀錄開發過程, 利於追出 bug
  3. 測試函數盡量使用 < <(...) 寫法來取代 |, 這樣可以讓 make test 時每次的畫面結果完全一致,利於比較每次改版後功能是否正常(此語法為 bash ㄊ, dash/sh 沒有)
  4. dash 使用變數存放 10000多個套件名稱做循序查詢運作速度在網樂通太慢

已知問題

  1. shpkg 版本比對誤將 xxx-9-1 認為比 xxx-10-1 版本還新
    A: 因為採用簡單的 sort 比對法, 希望有人提供正確的 bash 函數, 才可能比對成功
  2. 套件列表有重複的套件名稱時, 僅安裝第一個,若仍需要安裝,可改以 repository/package_name 輸入套件名稱,或是手動修改套件名稱並自建套件列表
  3. shpkg -Qo /usr/bin/ar 找不到
    A: 因為 shpkg-st 以更改目錄方式安裝, 因此自己手動下指令
    grep usr/bin/ar /var/lib/shpkg/local/*/files 就可以查到 stlinux23-sh4-binutils 套件
  4. shpkg 本身不檢查檔案複寫別的套件的問題
  5. shpkg -S 會自動安裝相依的程式函式庫,但有時失靈,需自行指定安裝, 方法參考網址
  6. 裝了 shpkg 要換裝 shpkg-st 失敗A:因為這兩個檔其實是互相衝突的, 暫時解法如下
    1. 從 shpkg 改 shpkg-st(適用於網樂通內部)
      1. shpkg -Sw shpkg shpkg-st # 兩個都先下載
      2. shpkg -R shpkg
      3. rm -rf /opt/STM # 移除之前裝到目錄的檔案
      4. tar xf /var/cache/shpkg/pkg/shpkg-st-<version>.txz
      5. shpkg -S shpkg-st
    2. 從 shpkg-st 換 shpkg(適用於PC端)
      1. shpkg -Sw shpkg shpkg-st # 兩個都先下載
      2. shpkg -R shpkg-st
      3. rm -rf /opt/STM # 移除之前的連結
      4. shpkg -S shpkg
  7. 發現 google 似乎會 cache 相同檔名的資料一段時間, 所以看得到新的 sha1sum 但無法正確下載到檔案, busybox 的 wget 沒有 --no-cache 功能, 所以若急的話可以改換wget, 方法如下:
    1. shpkg -S stlinux24-sh4-wget
    2. /usr/bin/wget  # 先使用看看確定可以使用
    3. rm /bin/wget # 移除 busybox 的 wget 連結

版本更新

  • 2013/01/09 支援 busybox rpm 安裝版
  • 2013/01/11 支援 rpm, txz
  • 2013/01/12 支援 rpm, txz, tgz
  • 2013/01/12-2 修正 shpkg-st 少封裝 opt 目錄問題
  • 2013/01/13 v13012-3 增加 test 套件庫,只包裝還沒測過, 收錄 626 套件
  • 2013/01/15 v13015-1 增加 -r 選項, 修正 owner 功能
  • 2013/01/15 v13015-2 修正套件列表, 支援多種檔名分段格式
  • 2013/01/17 v13016-1 修正套件升級時勿將 shpkg 和 shpkg-st 檔名判斷錯誤問題
  • 2013/01/18 v13016-4 設定檔套件庫下載網址改設為 googlecode
  • 2013/01/18 v13018-1 修正 -St 功能
  • 2013/01/19 v13019-1 修正 -Qo 功能
  • 2013/01/21 更新 stlinux 套件庫, st23:808套, stsh4:742套
  • 2013/01/23 加入 fedora9 套件庫 8270 套(已測試 agrep 可使用)
  • 2013/01/23 v130123-2 修正同名套件安裝問題
  • 2013/01/26 新增 -E 以套件so對照檔找出相依性套件功能, 修正 -Qo 顯示訊息
  • 2013/01/27 v130127-2 加入 fedora9 套件so對照檔, 移除 'file/realpath' 相依性, 加速 shpkg -E 速度
  • 2013/01/28 v130128-1 增加 shpkg -E 搜尋深度(會變慢), 以利正確判斷(例如安裝: mysql)
  • 2013/01/29 v130129-1 修正 shpkg -E 找 ssl.so 時,優先找到 fedora lighttpd 的問題
  • 2013/02/15 v130215-1 加速 shpkg -Q. 修正 sh4twbox-kernel 版本解析錯誤問題
  • 2013/02/16 增加找 library 方法說明
  • 2013/03/04 說明 fedora 套件問題自2013/03起,目前所有 fedora9 repository 因為原日本網站不再提供, 只能靠網友之前備份檔案. 目前盡量使用 stlinux 部份套件. 若有人提供 mirror site 空間, 再想辦法放進去.
  • 2013/06/27 fedora 套件回來了, 該網站又提供下載了, 使用方式請自行調整 /etc/shpkg.conf 將 fedora 那兩行開頭的 # 註解移除即可.
  • 2013/10/25 release 20131025-3528 版,使用 dash 編寫,因此使用 busybox 即可執行
  • 2013/10/26 release 20131026-6bba 版,儘量移除 grep 加速運作
  • 2013/10/30 release 20131029-1.1062 版,修正 shpkg -Ql rpm 問題
  • 2013/11/04 release 20131103-1.4f69 版
    • 增加 shpkg -S 可以自動安裝相依性套件
    • 完成 shpkg -E 安裝 so 檔案功能
    • 改善 shpkg -Q 速度
    • 將 2013*版 .so 索引檔更明為 soidx 以避免和13*版檔名混淆
  • 2013/11/05 release 20131105-1.26e0 版
    • 增加 -SE 安裝相依套件 , -SEs 快速功能
    • 修正 soidx 索引檔

2 則留言:

小訊號 提到...

shpkg 版本比對誤將 xxx-9-1 認為比 xxx-10-1 版本還新
A: 因為採用簡單的 sort 比對法, 希望有人提供正確的 bash 函數, 才可能比對成功




請問不能將版號由xxx-9-1 變成 xxx-09-01
這樣在比對時排序就應該不會有問題!!

派樂靈丹 提到...

因為套件來源眾多,包含 fedora,stlinux 及本站自編套件, 套件版本編號及命名方式不是自己能決定的.