本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或重新修改使用,但需要註明來源。 署名 4.0 國際 (CC BY 4.0)

本文作者: 蘇洋

創建時間: 2018年10月08日 統計字數: 4581字 閱讀時間: 10分鐘閱讀 本文鏈接: soulteary.com/2018/10/0


搭建軟體倉庫回源代理拾遺

這次機器升級帶來的服務大遷移過程中,我發現之前設定給 Npm 倉庫、Docker 倉庫專用的代理服務失效了。

之前這台專供倉庫使用的代理服務,是跑在一台古老的群暉設備(DS115j)上的,當我探尋問題登錄設備之後,發現了一件事:不光是代理程序進程消失了、守護進程管理軟體也消失了,這大概率是群暉系統自動升級造成的。

考慮服務穩定性和維護成本,我決定把代理服務從群暉中剝離,正巧前一陣收拾屋子,發現還有一台「MTK7621」的迅雷下載寶,決定廢物利用一下,做一台穩定性更高的代理服務設備。

如果你有閑置路由器或者下載寶,也有類似需求,那麼下面的內容,應該可以幫到你。

更換服務載體的考慮

為什麼選擇類路由設備的下載寶作為服務載體呢,主要是考慮以下幾個角度:

  • 穩定的白盒環境:
    • 相比較在低端群暉中使用(非 Docker 容器運行),會受到不確定的系統環境變化影響,開源的 OpenWRT 更值得信賴,從配置到應用軟體,全部都敞開在你的面前。
    • 路由器文件系統多數只讀,保障了環境的穩定。

  • 相對夠用的資源:
    • 性能足夠,發熱量低。
    • 下載寶支持通過 USB 進行儲存擴展,當然,使用機身自帶的 SD / MMC 卡槽擴展的容量也足夠我們使用了。
  • 安靜卻不失小巧:
    • 如果說 DS115j 幾乎靜音,下載寶、多數路由無風扇設計的設備則是絕對靜音。
    • 相比較一本大部頭書厚的 DS115j 來說,下載寶和小米充電寶差不多的體積,極大的節省空間。

初始化設備

編譯固件,網上講的太多了,這裡就不贅述了,教程在 GitHub 和一些個人博主的日誌上都有,如果實在懶得編譯可以使用網上的固件,尋找你信任的作者的三方固件也不是不可以。

我這裡會著重寫一些和常規路由器不同的地方。

由於下載寶只有一個 RJ45 介面,所以他只能作為單臂路由或者普通的網路客戶端使用,這裡我們為了更少的性能損耗和維護成本,會將設備作為網路客戶端使用。

選擇 BootLoader

在進行固件刷新之前,考慮到有可能出現固件刷新失敗造成無法啟動、無法再次刷入,建議先了解並刷入一個穩定可靠的 BootLoader ,普遍的選擇是:

  • breed
  • uboot

我這裡推薦使用 Breed ,如果你使用的設備也是下載寶,那麼可以使用下面的地址:

https://breed.hackpascal.net/breed-mt7621-xunlei-timeplug.bin

當你將 Bootloader 刷入設備之後,下載寶啟動進入 Breed 和其他的設備不同,需要長按的不是 Reset 按鍵,而是位於 Reset 按鍵小孔上方的硬碟彈出按鈕。

斷開設備電源,長按硬碟彈出按鈕,給設備供電,等待設備啟動完畢,訪問 http://192.168.1.1/ 即可打開 Breed 的管理界面。

在進行刷機過程中,除了選擇你的固件文件之外,其他一切保持默認值即可。

默認鑒權

如果你使用的官方配置編譯出的固件,默認賬號一般是 root, 密碼為 admin

在登錄管理界面之後,需要對 Dropbear 提供的 SSH 訪問功能中添加你的 SSH 密鑰, 以方便後面的操作。

時間相關設置

有的代理軟體考慮重放攻擊,所以會涉及到「當前執行環境時間」這個因素。

為了保障這類軟體的正常使用,我們需要先設置靠譜的 NTP 伺服器,從網上可以找到大量資源,比如:

  • 1.cn.pool.ntp.org
  • ntp1.aliyun.com

選擇你覺得靠譜的,進行設置就好了。

清理無用軟體

考慮到我們只是要一個穩定可靠的代理服務,所以官方固件、三方固件中包含的許多內容是可以直接清理掉的,比如我們不需要文件共享服務等。

opkg remove luci-app-samba --force-removal-of-dependent-packages
opkg remove samba36-server

可以看到,如果你想連鍋端一些軟體,可以使用 --force-removal-of-dependent-packages 這個參數,但是這個參數不是萬能的,對於 CLI 軟體和管理面板脫離的安裝包,還需要額外進行卸載操作。

另外,如果你對 luci-* 軟體包進行了卸載,必須進行重啟,才能夠將管理後台上的菜單完全乾掉。

準備軟體存儲空間

前面提過,路由類設備的文件系統多數被設定為了只讀類型,一旦重啟將會把所有修改打回原形,除非執行了一些特殊的命令,將改動同步到設備中。

並且多數設備可用快閃記憶體的空間都非常有限,這裡要外儲存器進行一些操作,來擴展可用空間。

在進行空間擴展之前,需要先了解哪個設備該被「安排」,使用 fdisk 命令:

OpenWrt:~# fdisk -l

...

Disk /dev/mtdblock6: 5.8 MiB, 6029312 bytes, 11776 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk /dev/mmcblk0: 7.4 GiB, 7969177600 bytes, 15564800 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

這裡名為 /dev/mmcblk0 的設備就是外置儲存卡了,使用 mkfs.ext4 命令可以對其進行格式化。

OpenWrt:~# mkfs.ext4 /dev/mmcblk0
mke2fs 1.44.1 (24-Mar-2018)
Found a dos partition table in /dev/mmcblk0
Proceed anyway? (y,N) y
Creating filesystem with 1945600 4k blocks and 486720 inodes
Filesystem UUID: 01f3548b-a8e9-418a-ae37-fbe8e710826e
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks):
done
Writing superblocks and filesystem accounting information: done

當設備格式化完成之後,我們並不能夠真正的開始使用。

如果你熟悉操作 fstab 的話,直接編輯 fstab 文件可以把剛剛格式化好的分區進行掛載點分配,如果不熟悉,OpenWRT 管理界面有專門針對掛載點進行設置的頁面。

我這裡將剛剛的儲存卡使用 ext4 文件系統掛載到了 /data 目錄。

將設備設置為網路客戶端

將電腦和下載寶使用網線連接,因為我們不需要將它當路由使用,所以可以在管理界面將 DHCP 服務先進行關閉。

然後打開介面管理界面,將唯一的介面的網路協議設置為 DHCP 客戶端,這裡需要注意,當你點擊保存後,新版的控制台會先進行嘗試配置,這個配置是肯定會失敗的,所以會提示你是否要進行回滾操作還是繼續進行強制應用,當然是後者。

在你點擊強制應用之後,便可以將下載寶和電腦斷開連接,將下載寶和路由器進行連接,然後直接訪問路由器分配的IP即可繼續進行管理操作。

因為是在內網進行服務,所以可以繼續在介面配置中,將 IPV6 關閉。

安裝OpenWRT離線軟體包

通過 SCP 等命令,我們可以將下載好的軟體安裝包傳送到下載寶上,但是當你使用 opkg 命令進行安裝的時候,很可能會遇到下面的情況:

OpenWrt:~# opkg install ./package.ipk
Unknown package package.
Collected errors:
* pkg_hash_fetch_best_installation_candidate: Packages for package found, but incompatible with the architectures configured
* opkg_install_cmd: Cannot install package package.

解決方案其實很簡單,先通過 opkg 命令查看你支持的軟體包。

OpenWrt:~# opkg print-architecture
arch all 1
arch noarch 1
arch mipsel_24kc 10

可以看到,下載寶支持的軟體包架構是 mipsel 24kc

而如果你要查找一些軟體的話,可以從官方的軟體倉庫中獲取:http://archive.openwrt.org/releases/18.06.0/packages/

配置代理軟體

代理軟體有許多種,所以這裡不對具體的軟體進行配置,只是聊一下一些通用的處理。

自動啟動

使用命令行啟動代理軟體很容易,但是如果想達到「判斷程序沒有運行再執行啟動命令」就需要藉助腳本來實現了。

#!/usr/bin/env sh

EXIST=$(ps | grep 軟體名稱 | grep -v grep)

if [ "${EXIST}" == "" ]; then
echo Start new proxy client.
/data/軟體名稱 &
fi

將腳本保存到一個固定的位置,比如上文中提到的外置儲存器中 /data/check.sh,然後配置「計劃任務」(crontab) ,然系統每分鐘自動檢查是否應該啟動代理軟體,避免代理軟體崩潰後無法提供服務。

*/1 * * * * /data/check.sh

重啟進程

非商業級產品,在長時間運行的過程中,難免出現內存泄露等問題,導致資源越用越多,但是提供的服務卻越來越差,甚至完全不提供服務,變成一個殭屍進程。

為了解決這個問題,我們可以使用自動重啟軟體的策略,但是同樣的,這裡也需要編寫一個簡單的腳本:

#!/usr/bin/env sh

EXIST=$(ps | grep 軟體名稱 | grep -v grep)

if [ "${EXIST}" != "" ]; then
echo "restart client"
echo ${EXIST} | awk NR==1{print $1} | xargs kill -9
/data/軟體名稱 &
fi

同樣的,在計劃任務中添加一個新的腳本,可以做到讓程序每小時自動重啟,避免潛在的資源佔用過多卻不去釋放的問題。

* */1 * * * /data/restart.sh

最後

如果你認為你的虛擬機同樣穩定、或者路由器有大量的冗餘資源,也可以將這個功能放在他們上面,但是個人建議是做成 「單一職責」、「簡單可依賴」 的服務,不搞巨無霸。

喜歡折騰的小夥伴可以掃二維碼添加好友(記得註明來源和目的,方便備註拉群)。

我計劃拉個小群,把喜歡折騰的朋友聚一起,在不發廣告的情況下,聊聊軟體、HomeLab、編程上的一些問題,來擴展和積累一些寫作素材。

—EOF


推薦閱讀:
查看原文 >>
相关文章