背景
- 最近在处理国产系统银河麒麟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