想像一下,在沒有網路的工業現場、偏遠站點,或是對安全性要求極高的生產線上,當你需要為設備上的 Ubuntu 系統安裝一個新的應用程式或更新現有軟體時,卻發現缺少了必要的套件(dependencies)… 這是不是聽起來就像一場數位世界的「巧婦難為無米之炊」?
在工業電腦 (IPC) 領域,設備部署在隔離的生產環境中是家常便飯,網路連線往往是個奢望。這時候,如果想在這樣的環境中安裝一個應用程式,而它又依賴於系統中沒有的套件,該怎麼辦呢?
你可能會想到用光碟片來安裝,但光碟容量有限,不可能包含所有套件,而且現在很多 IPC 根本沒有光碟機了。或者,你也可以從有網路的電腦上下載套件,再一個一個複製過去。但問題來了:你需要哪些套件?它們之間又有什麼複雜的依賴關係?手動處理這些,簡直是場惡夢!
別擔心!研華的工程師們也遇到了這個挑戰,並且發揮了他們的聰明才智,找到了一個既巧妙又實用的解決方案!
我們的靈感來源:把 ISO 檔變成你的「隨身套件庫」!
現代 Linux 系統(包括 Ubuntu)有個很棒的功能,就是可以把一個 ISO 映像檔掛載(mount)成一個本地資料夾。這給了我們一個啟發:既然如此,我們能不能把所有需要的套件都打包進一個 ISO 檔裡,然後在離線主機上把這個 ISO 檔掛載起來,讓系統的套件管理工具(apt 或 apt-get)以為這是一個「本地的網路套件庫」呢?
答案是:可以! 而且我們的實驗證明,這個方法非常有效!
接下來,就讓我們一起看看研華工程師是如何一步步實現這個「離線套件管理魔法」的吧!
研華實驗室揭秘:離線套件庫的誕生之旅
整個過程可以分為幾個主要階段:準備、製作、部署、使用與收尾。聽起來有點像一場精心策劃的任務,對吧?
小提醒: ✍️ 如果在執行指令時遇到權限問題,請記得在指令前加上
sudo。 ✍️ 雖然範例中使用了相對路徑,但實際操作時建議使用絕對路徑,更不容易出錯喔!
階段一:準備你的「套件收集站」
首先,我們需要一個有網路的環境來收集所有目標主機可能需要的套件。這個環境越「乾淨」越好,因為這樣製作出來的 ISO 檔才會越小。最好的做法是從一個全新的系統開始建置。記住一個原則:環境越乾淨,ISO 檔就越小巧!
階段二:製作你的專屬「離線套件庫 ISO」
這是整個過程中最關鍵的一步!我們將在這個有網路的環境中,把需要的套件「抓」下來,並製作成一個特殊的 ISO 映像檔。
如果你執行指令時遇到找不到指令或錯誤,請先安裝相關的套件。
以下是製作 ISO 的指令步驟:
mkdir -p my-ISO
cd my-ISO
dpkg --get-selections | grep 'install' | awk '{ print $1; }' | xargs apt download
dpkg-scanpackages . | gzip -9c > Packages.gz
mkdir .disk
echo "My Dependencies - $(lsb_release -is) - $(lsb_release -rs)" > .disk/info
mkisofs -V MyDependencies -o MyDependencies.iso -r -J .
- Line 1: 建立一個名為
my-ISO的空資料夾,用來存放我們收集到的所有套件。資料夾名稱可以自己決定。 - Line 3: 進入
my-ISO資料夾,作為我們的工作目錄。 - Line 4: 查詢目前系統中所有已安裝的套件,並將它們下載到當前資料夾。
- Line 5: 產生一個名為
Packages.gz的特殊壓縮檔。這個檔案是製作 ISO 映像檔的基礎,它包含了套件的索引資訊。檔案名稱也可以自己決定。 - Line 7: 建立一個名為
.disk的資料夾(注意開頭的點)。這個資料夾名稱是規範定義的,請不要更改。 - Line 8: 在
.disk資料夾下建立一個名為info的資訊檔。這個檔案名稱也是規範定義的,請不要更改。 - Line 10: 建立最終的 ISO 映像檔,名為
MyDependencies.iso。-V:指定 Volume ID (磁碟區名稱或標籤),可以自己取名。-o:指定輸出檔案名稱,可以自己取名。-r:設定檔案權限和模式為更實用的值。-J:除了標準的 ISO9660 檔名外,也產生 Joliet 目錄記錄,以支援更長的檔名。
階段三:將 ISO 檔遷移到離線主機
這一步很簡單,就是用你熟悉的方式(例如 USB 隨身碟、內部網路傳輸等),把剛剛製作好的 MyDependencies.iso 檔案複製到目標離線主機上。
階段四:掛載 ISO 映像檔
現在,我們要在離線主機上把這個 ISO 檔「啟用」起來,讓系統能夠讀取裡面的內容。
mkdir -p my-mount-point
mount -o loop MyDependencies.iso my-mount-point
cp -rf my-mount-point my-repo
- Line 1: 建立一個空資料夾作為 ISO 映像檔的掛載點。資料夾名稱
my-mount-point可以自己決定。 - Line 2: 將
MyDependencies.iso映像檔掛載到剛剛建立的掛載點資料夾。 - Line 3: 將掛載點資料夾的內容完整複製到一個新的資料夾
my-repo。為什麼要複製呢?因為 ISO 檔通常是以唯讀方式掛載的,而作為一個本地套件來源庫,我們需要它是可寫入的。你可以更改目標資料夾名稱。
階段五:將本地資料夾添加為套件來源
接下來,我們要告訴系統的套件管理工具 apt,去哪裡找到我們的「隨身套件庫」。
首先,為了保險起見,先備份系統原有的套件來源設定檔:
mv -f /etc/apt/sources.list /etc/apt/sources.list.BAK
然後,建立一個新的設定檔,指向我們的本地套件庫:
echo "deb [trusted=yes] file:/full/path/to/my-repo ./" > /etc/apt/sources.list
請注意,這裡的 /full/path/to/my-repo 需要替換成你實際複製套件庫資料夾的完整路徑。
階段六:更新系統套件來源列表
執行這個指令,讓系統重新整理套件來源資訊,認識我們的本地套件庫:
apt update
階段七:開始安裝你需要的套件吧!
見證奇蹟的時刻到了!現在,你就可以像在有網路的環境中一樣,使用 apt 或 apt-get 指令來安裝所有你需要的套件了!系統會自動從你剛剛設定的本地套件庫中尋找並解析所有依賴關係,然後完成安裝。如果你的目標應用程式本身就能處理依賴關係,甚至可以直接安裝應用程式本身,一步到位!
階段八:收尾工作
任務完成後,建議將系統恢復到原始狀態,移除我們添加的本地套件來源設定,並卸載 ISO 映像檔。
mv -f /etc/apt/sources.list.BAK /etc/apt/sources.list
umount my-mount-point
rm -rf my-mount-point
rm -rf my-repo
apt update
- Line 1: 恢復系統原有的套件來源設定檔。
- Line 2: 從作業系統中卸載 ISO 映像檔。
- Line 3 和 Line 4: 移除我們建立的中間資料夾。
- Line 5: 再次更新系統套件來源列表。
實驗成果與應用價值
透過這個方法,我們成功地在一個完全離線的 Ubuntu 環境中,實現了套件的自動化安裝與依賴解析。這意味著:
- 大幅簡化離線部署: 不再需要手動下載和追蹤複雜的套件依賴關係。
- 提高效率與可靠性: 像在線一樣使用
apt,安裝過程更順暢、錯誤更少。 - 適用於各種離線場景: 無論是工廠自動化、能源監控、交通運輸,還是任何網路受限的邊緣運算應用,都能輕鬆應對軟體部署與更新的需求。
- 展現研華的創新能力: 這是研華工程師針對實際工業應用痛點,自主研究並驗證的有效解決方案。
與傳統手動方式相比,這個方法不僅節省了大量的時間和人力,更重要的是,它提供了一個標準化、可靠的離線軟體部署流程。
結論與未來展望
這次實驗成功地證明了,即使在沒有網路的嚴苛環境下,我們依然有辦法透過巧妙的技術手段,讓 Ubuntu 的套件管理工具發揮作用。這只是研華在解決工業物聯網挑戰方面的一個縮影。
我們深知,工業現場的需求千變萬化,技術挑戰層出不窮。研華始終致力於深入理解客戶的實際應用場景,並投入持續的研發,尋找創新、可靠的解決方案。這次的離線套件管理方法,正是我們積極探索、不斷進步的體現。
未來,我們也將持續優化這個流程,甚至考慮將其整合到我們的軟體工具或服務中,讓客戶能夠更輕鬆地在各種複雜環境下部署和管理他們的 Advantech 設備與應用。
如果您在離線環境下的軟體部署或套件管理方面遇到任何挑戰,或者對這項技術感興趣,歡迎隨時與您的研華 AE 或銷售業務聯繫。我們樂於分享更多經驗,並提供專業的支援!