linux离线安装包和依赖的下载和安装

背景

  • 最近在处理国产系统银河麒麟v10下离线安装wine的问题,但是刚开始用了多种离线安装方式都没能很好的解决依赖问题,用到的库包括apt-offline apt-rdepends,效果都不是很好,总是存在各种报错,如“gpgv: not a detached signature”,“E: Can't select candidate version from package debconf-2.0 as it has no candidate”等。
  • 后来用“apt-get --print-uris -y install 包名”、 “dpkg --force-all -i *.deb”、“apt --fix-broken install” 等命令配合,很好解决了安装问题。
  • 这里只讲其中一部分依赖的解决思路。 同时也适用于如Ubuntu等linux系统。

注意

  • 用这个方法,需要准备一个没有安装过相关依赖的能联网的系统,否则会导致包无法下载或者不全。
  • 系统版本必须相同,安装deb包都需要注意这个问题。

主要脚本

使用方法:将需要下载的包写入到一个txt文件中,空格或者换行符隔开。执行下面命令会把相关包和依赖下载到当前文件夹。但是有的依赖复杂的可能无法一次性下载完,参考后续步骤。

  • 用法示例
    输出到当前目录:
bash ./download_deb.sh packages.txt

输出到指定目录:

bash  ./download_deb.sh packages.txt /tmp/debs
  • download_debs.sh
#!/bin/bash
set -e

# 1. 读取参数
PKG_FILE="$1"          # 包列表文件
DOWNLOAD_DIR="${2:-.}" # 下载路径(缺省为当前目录)

# --- 参数检查 ---
if [[ -z "$PKG_FILE" ]]; then
    echo "Usage: $0 <pkg-list-file> [download-dir]" >&2
    exit 1
fi

if [[ ! -f "$PKG_FILE" ]]; then
    echo "Error: $PKG_FILE not found!" >&2
    exit 1
fi

# 确保下载目录存在
mkdir -p "$DOWNLOAD_DIR"

# 2. 读取包名
read -ra SEED_PKGS <<< "$(tr '\n' ' ' < "$PKG_FILE")"
if [[ ${#SEED_PKGS[@]} -eq 0 ]]; then
    echo "Error: No packages found in $PKG_FILE!" >&2
    exit 1
fi

echo "Packages to download: ${SEED_PKGS[*]}"
echo "Download directory: $DOWNLOAD_DIR"

# 3. 生成下载列表并下载
echo "Generating download URIs ..."
cd "$DOWNLOAD_DIR"  # 切换到目标目录再下载
apt-get --print-uris -y install "${SEED_PKGS[@]}" |
grep "^'" |
cut -d"'" -f2 |
tee urls.txt |
while read -r url; do
    echo "Downloading $(basename "$url") ..."
    wget -c "$url"
done

echo "All done! Files saved to $(pwd)"

下载依赖,制作离线安装包

在线安装教程参考的 http://www.linzeit.com/a/news/248.html

  • 安装wine需要这个命令
sudo dpkg --add-architecture i386
sudo apt update
  • 将需要下载的包写入packages.txt
vim packages.txt
cat packages.txt
libasound2-plugins:i386 libc6:i386 libncurses5:i386 libstdc++6:i386 libx11-6:i386 libxext6:i386 libxinerama1:i386 libxrandr2:i386 libxrender1:i386 libglu1-mesa:i386 libpulse0:i386 libdbus-1-3:i386
  • 批量下载包到 debs/
bash ./download_debs.sh packages.txt debs/
  • 安装下载的deb包
sudo dpkg -i debs/*.deb
...
Setting up libxrandr2:i386 (2:1.5.2-0kylin1) ...
Setting up libglx0:i386 (1.3.2-1~kylin0.20.04.2) ...
Setting up libgl1:i386 (1.3.2-1~kylin0.20.04.2) ...
Setting up libglu1-mesa:i386 (9.0.1-1build1) ...
Processing triggers for libc-bin (2.31-0kylin9.2k0.2) ...
Processing triggers for man-db (2.9.1-1kylin0k1.0) ...
Errors were encountered while processing:
 libsystemd0_245.4-4kylin3.20k2.14_i386.deb
 libdbus-1-3:i386
 libpulse0:i386
 libasound2-plugins:i386
  • 查看是否有依赖缺失,不要安装,找到需要安装的包直接退出安装,如果安装了,就不好获取离线包了
sudo apt --fix-broken install
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Correcting dependencies... Done
The following additional packages will be installed:
  libsystemd0:i386
The following NEW packages will be installed:
  libsystemd0:i386
0 upgraded, 1 newly installed, 0 to remove and 31 not upgraded.
3 not fully installed or removed.
Need to get 434 kB of archives.
After this operation, 956 kB of additional disk space will be used.
Do you want to continue? [Y/n] n
Abort.
  • 经查看仍然有一个依赖缺失,写入到txt文件
echo "libsystemd0:i386" > add.txt
  • 补充下载依赖到新的文件夹
bash ./download_debs.sh add.txt add/
  • 安装下载的deb包
sudo dpkg -i add/*.deb
  • 查看是否有依赖缺失,如果没有会自动安装先前未成功安装的包
sudo apt --fix-broken install
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 31 not upgraded.
3 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Setting up libdbus-1-3:i386 (1.12.16-2kylin2.3k0.9) ...
Setting up libpulse0:i386 (1:13.99.1-1kylin114k4.11) ...
Setting up libasound2-plugins:i386 (1.2.2-1kylin1) ...
Processing triggers for libc-bin (2.31-0kylin9.2k0.2) ...
  • 再次查看是否有依赖缺失,直到没有完整为止
sudo apt --fix-broken install
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 31 not upgraded.
  • 有时候为了避免安装重启后再次运行程序无法找到.so文件,最好执行下面命令
sudo ldconfig

制作离线安装包

  • 制作离线包,可以将deb包合并到一个文件夹中
  • 可以写shell脚本,简化安装过程

安装离线包

  • 强制安装deb包,如果不加--force-all可能依然会导致安装不完整
sudo dpkg  --force-all -i debs/*.deb
  • 检查依赖是否完整
sudo apt --fix-broken install
sudo ldconfig
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容