參考文檔:
https://my.oschina.net/u/3362827/blog/860711
https://blog.csdn.net/candcplusplus/article/details/52156324
https://www.cnblogs.com/silvermagic/p/7665841.html
https://blog.csdn.net/junbujianwpl/article/details/52811153
環境:
一臺能上網的Ubuntu電腦,一臺不能上網的Ubuntu電腦。Ubuntu版本都是18.04LTS。
目標:
將能上網的Ubuntu電腦安裝的軟件製作成源,通過U盤拷貝給內網電腦,內網電腦根據此離線源通過apt安裝軟件。
爲什麼不直接拷貝deb安裝呢?因爲有些軟件安裝依賴的包比較多。
遇到的問題:
從Ubuntu 16.04 (xenial)起, 在將本地deb軟件包創建repo時候,跟14.04以前的版本相比,強制要求gpg對Release文件簽名,否則無法使用。
步驟:
1.在外網電腦上,安裝gpg軟件和相關軟件:
apt-get install gnupg
apt-get install rng-tools
密鑰創建過程中,需要使用到足夠的隨機數(random),可先行安裝rng-tools, 該工具可以常駐後臺的方式, 生成隨機數,避免gpg密鑰創建過程中的長時間等待問題
rngd -r /dev/urandom
生成公鑰和私鑰:
gpg --gen-key
執行gpg會進入一些對話,其中要新建一個用戶名username和相應的密碼。
結束之後,輸入命令,可以查看key:
gpg --list-key
導出gpg公鑰和私鑰:
私鑰,供Server端,對release文件簽名使用,好像不做也能簽名
gpg -a --export-secret-keys username > Ubuntu_Local_Archive_Automatic_Signing_Key_2017.sec
公鑰,需在Ubuntu client 導入,供apt-get使用
gpg -a --export username> username.pub
2.在外網電腦上準備安裝包源
以下是安裝包目錄
$ sudo rm -rf /var/cache/apt/archives/* # 清空緩存目錄,這一步也可以不做
-d只是下載安裝包,並不安裝。
$ sudo apt-get -d install <包名>
在本地建一個目錄,將下載下來的安裝包拷貝到此目錄:
$ mkdir /var/debs
$ cp -r /var/cache/apt/archives/*.deb /var/debs/
在debs這個目錄創建Packages.gz,注意生成的路徑帶debs,否則內網安裝時會說找不到文件
# apt-ftparchive packages debs > debs/Packages
# cd debs
# gzip -c Packages > Packages.gz
在debs這個目錄下創建release file
# apt-ftparchive release ./ > Release
ubuntu apt-get 對軟件包索引,首先要求InRelease文件,其次纔去找Release、Release.gpg文件; 這情況下, 其實只需要創建InRelease文件(包含Release文件和明文簽名)即可:
#gpg --clearsign -o InRelease Release
#gpg -abs -o Release.gpg Release
3. 將生成的debs目錄和公鑰文件username.pub拷貝到U盤
4.在內網的電腦上將debs目錄拷貝到/vars/下面,注意和外網的目錄一樣。
如下並導入公鑰。
# apt-key add username.pub
5.在內網電腦上備份apt源文件/etc/apt/source.list,並修改源。
$ sudo gedit /etc/apt/sources.list
將sources.list 原來的內容都註釋掉。在最後添加
$ deb file:/var debs/
- 注意上面的 /var 和 debs/ 之間的空格,以及 “/”。不要寫錯/var/debs/路徑了。
更新索引
$ sudo apt-get update
現在可以安裝包了。運行sudo apt-get install <包名> 就會像以前一樣安裝好了指定的包了。
6.安裝包的下載,一鍵下載所有關聯的包,可以參照