ubuntu 18.04 离线源制作与安装


文章目录

  • ubuntu 18.04 离线源制作与安装
  • 下载安装包(主机:可联网)
  • 生成包索引文件(主机:可联网)
  • 生成签名(主机:可联网)
  • 在不能上网的目标机上创建缓存目录(目标机:不能联网)
  • 更换为本地源(目标机:不能联网)
  • 导入公钥(目标机:不能联网)
  • 更新源(目标机:不能联网)
  • 一些问题:
  • 删除密钥
  • 关于/dev/null
  • 报错:sudo: dpkg-scanpackages: command not found
  • 注意
  • 普通用户用sudo echo权限依旧写入不了文件
  • Ubuntu中update、upgrade、full-upgrade的区别
  • apt 和 apt-get的区别
  • apt 和 apt-get的区别



说明:该方法是为了解决不能上外网的机器的安装依赖问题。大致思路就是将安装包及其依赖放到本地目录,然后生成索引,生成本地源。apt-get 版本高于1.5,

强制要求gpg对Release文件签名,否则无法使用,会相对复杂一些;低于1.5可用简单方法配置(同16.04方法)。

系统:Ubuntu 18.04

apt-get version:1.6.12(amd64)

下载安装包(主机:可联网)

目标机器是一个新安装系统的机器,所以需要做一个完整的包

# 清空缓存目录,该目录存的都是通过apt-get install 安装软件的的安装包及依赖包
sudo rm -rf /var/cache/apt/archives/*  
# 下载安装包,-d选项是只下载,不进行解析安装(只能下载未安装的软件)
# 需要的安装包及依赖都会下载到 /var/cache/apt/archives 目录
sudo apt-get -d install <包名>

生成包索引文件(主机:可联网)

sudo touch /var/debs/Packages.gz
# 必须增加文件的读写执行权限
sudo chmod -R 777 /var/debs

# 需要进入到debs目录
cd /var/debs
# 需要安装apt-utils工具
sudo apt-get install apt-utils -y
# 创建索引
# apt-ftparchive packages . > Packages 
# apt-ftparchive release ./ > Release 

# debs父目录
apt-ftparchive packages debs > debs/Packages
cd debs
gzip -c Packages > Packages.gz
# 创建release file
apt-ftparchive release ./ > Release

生成签名(主机:可联网)

# 需要下载gpg
sudo apt install gpg
sudo apt install gnupg
sudo apt install rng-tools

# 生成公钥和私钥
gpg --gen-key
# 暂时没用到 gpg -a --export pub_id | apt-key add -
# 查看key
gpg --list-key

# 导出gpg公钥——供apt使用
# gpg -a --export username> username.pub
gpg -a --export robot> robot.pub
# 导出gpg私钥——供server端使用
# gpg -a --export-secret-keys username > Ubuntu_Local_Archive_Automatic_Signing_Key_2017.sec
gpg -a --export-secret-keys robot > Ubuntu_Local_Archive_Automatic_Signing_Key_2020.sec

# 生成ASCII码的签名文件
gpg --clearsign -o InRelease Release
gpg -abs -o Release.gpg Release

在不能上网的目标机上创建缓存目录(目标机:不能联网)

sudo mkdir -p /var/debs
# 将之前主机上/var/cache/apt/archives目录下的所有文件全部拷贝到 /var/debs目录下
sudo cp -r *** /var/debs/

更换为本地源(目标机:不能联网)

修改 /etc/apt/sources.list 文件

# 备份原文件
cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 修改源文件
sudo vim /etc/apt/sources.list
# 将原来内容全部删掉,然后增加一行
# 注意写法
deb file:/var debs/

导入公钥(目标机:不能联网)

# apt-key add username.pub

apt-key add robot.pub

更新源(目标机:不能联网)

sudo apt-get update

然后就可以使用sudo apt-get install命令安装相关的软件了

一些问题:

删除密钥
# 先删除私钥: gpg --delete-secret-keys [用户ID]
gpg --delete-secret-keys robot
# 再删除公钥: gpg --delete-key [用户ID]
gpg --delete-key robot
关于/dev/null

/dev/null位置的参数是指定一个文件,文件名不限,该文件的作用是用来重写覆盖deb软件包中控制文件的某些定义,它的第一行的格式,一行对应一个软件包:

package priority section
#package 指定你所要修改的软件包
#priority 有low,medium,high三个值
#section 用来指定软件包属于哪个section

如果不需要对deb软件包做任何修改你就可以直接指定一个/dev/null文件

报错:sudo: dpkg-scanpackages: command not found
# 需要安装dpkg-dev工具
sudo apt-get install dpkg-dev

注意

兼容性问题,如果我们制作安装包时,用的是64位的ubuntu,那么该离线包只能在其他64位系统上安装。

有些软件对ubuntu server和ubuntu desktop版也不兼容。总之,在什么系统下制作的离线包,就在什么系统下安装。

普通用户用sudo echo权限依旧写入不了文件

用root身份就可以。其实原因很简单,shell对‘>’解释干扰了对这个命令含义的判断。我们本想应该是这样的意思:让sudo执行后面的这些echo ‘1′ > ip_forward,而实际上是:sudo echo ‘1′,执行到这里,shell再把它的执行结果重定向到ip_forward里去!当然是无权限,因为流本身不会随echo那样被sudo“感染”上suid权限!

#方案一:让后面那一串东西搁一起执行
sudo sh -c ‘echo 1 > ip_forward’
#方案二:用tee
echo ‘1′ | sudo tee ip_forward
Ubuntu中update、upgrade、full-upgrade的区别

apt install update:将远程软件库和本地软件库做对比,检查哪些软件可以更新,以及软件包依赖关系,给出一个分析报告。只检查不更新

apt install upgrade:在执行upgrade 之前要先执行update ,根据update的分析报告去下载并更新软件。在以下几种情况,某个待升级的软件包不会被升级。

  • 新软件包和系统的某个软件包有冲突
  • 新软件包有新的依赖,但系统不满足依赖
  • 安装新软件包时,要求先移除旧的软件包

apt install full-upgrade:在执行full-upgrade 之前也要先执行update ,升级整个系统,必要时可以移除旧软件包

apt 和 apt-get的区别

简单来说就是:apt = apt-get、apt-cache 和 apt-config 中最常用命令选项的集合

的软件包

apt install full-upgrade:在执行full-upgrade 之前也要先执行update ,升级整个系统,必要时可以移除旧软件包

apt 和 apt-get的区别

简单来说就是:apt = apt-get、apt-cache 和 apt-config 中最常用命令选项的集合