Ubuntu源配置修复

针对Ubuntu 软件源配置问题,以下是修复方案:

我们来创建两个修复脚本:

  1. 第一个脚本 (fix_apt_sources_noble.sh) 是针对 Ubuntu 24.04 (Noble) 的。它会自动检测你的系统版本,并提供多种镜像源选项(包括阿里云、华为云、清华、中科大以及官方源),然后测试哪个源可用并应用它。

  2. 第二个脚本 (fix_apt_sources_jammy.sh) 则是专门针对 Ubuntu 22.04 (Jammy) 的版本,功能类似。


1. 针对 Ubuntu 24.04 (Noble) 的优化脚本

将以下代码保存为 fix_apt_sources_noble.sh 并赋予执行权限 (chmod +x fix_apt_sources_noble.sh) 后运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!/bin/bash

# 脚本名称: fix_apt_sources_noble.sh
# 功能: 自动修复 Ubuntu 24.04 (Noble) 的 APT 源配置问题
# 支持官方源及多个国内镜像源(阿里云、华为云、清华、中科大)
# 使用方法: ./fix_apt_sources_noble.sh

set -e # 遇到错误立即退出

EXPECTED_CODENAME="noble"
CURRENT_CODENAME=$(lsb_release -cs 2>/dev/null || echo "unknown")

if [[ "$CURRENT_CODENAME" != "$EXPECTED_CODENAME" ]]; then
echo "⚠️ 警告: 此脚本设计用于 Ubuntu $EXPECTED_CODENAME ($EXPECTED_CODENAME),但检测到您的发行版代号是 '$CURRENT_CODENAME'。"
read -p "是否继续? (y/N): " confirm && [[ $confirm == [yY] ]] || exit 1
fi

echo "🔍 开始修复 Ubuntu $EXPECTED_CODENAME 的 APT 源配置..."

# 备份当前 sources.list 文件
BACKUP_FILE="/etc/apt/sources.list.backup.$(date +%Y%m%d_%H%M%S)"
echo "📁 正在备份当前配置到 $BACKUP_FILE ..."
sudo cp /etc/apt/sources.list "$BACKUP_FILE"

# 获取系统架构
ARCH=$(dpkg --print-architecture)
echo "🖥️ 检测到系统架构: $ARCH"

# 定义源列表
declare -A SOURCES=(
["官方源"]="http://archive.ubuntu.com/ubuntu/"
["阿里云"]="https://mirrors.aliyun.com/ubuntu/"
["华为云"]="https://mirrors.huaweicloud.com/repository/ubuntu/"
["清华大学"]="https://mirrors.tuna.tsinghua.edu.cn/ubuntu/"
["中科大"]="https://mirrors.ustc.edu.cn/ubuntu/"
)

# 创建临时 sources.list 内容
generate_source_list() {
local base_url=$1
cat << EOF
# Ubuntu $EXPECTED_CODENAME (noble) - $(basename "$base_url")
deb $base_url noble main restricted universe multiverse
deb $base_url noble-updates main restricted universe multiverse
deb $base_url noble-security main restricted universe multiverse
deb $base_url noble-backports main restricted universe multiverse

# 源码包(可选)
# deb-src $base_url noble main restricted universe multiverse
# deb-src $base_url noble-updates main restricted universe multiverse
# deb-src $base_url noble-security main restricted universe multiverse
# deb-src $base_url noble-backports main restricted universe multiverse
EOF
}

# 测试源的函数
test_source() {
local url=$1
echo "🧪 正在测试源: $url"
# 创建临时 sources.list 文件进行测试
generate_source_list "$url" > /tmp/test_sources.list
# 替换为临时源以进行测试
sudo cp /tmp/test_sources.list /etc/apt/sources.list

# 执行 apt update 并捕获输出和返回值
output=$(sudo apt update 2>&1)
retval=$?

if [ $retval -eq 0 ]; then
echo "✅ 测试成功: $url 可用"
return 0
else
echo "❌ 测试失败: $url 不可用"
# echo "$output" # 如果需要详细错误信息可以取消注释
return 1
fi
}

# 主逻辑:遍历源列表进行测试
FOUND_WORKING_SOURCE=false
for name in "${!SOURCES[@]}"; do
if test_source "${SOURCES[$name]}"; then
FOUND_WORKING_SOURCE=true
echo "🎉 成功找到可用源: $name (${SOURCES[$name]})"
break
fi
done

# 清理临时文件
rm -f /tmp/test_sources.list

# 结果处理
if [ "$FOUND_WORKING_SOURCE" = true ]; then
echo "✅ APT 源已成功更新并验证。"
echo "💡 如需恢复原始配置,请执行:"
echo " sudo mv $BACKUP_FILE /etc/apt/sources.list && sudo apt update"
else
echo "❌ 所有预定义源均无法访问。请检查网络连接或稍后再试。"
echo "🔄 正在恢复原始 sources.list 配置..."
sudo mv "$BACKUP_FILE" /etc/apt/sources.list
echo "🔄 已恢复原始配置。"
exit 1
fi

echo "🏁 APT 源修复完成。"

2. 针对 Ubuntu 22.04 (Jammy) 的优化脚本

将以下代码保存为 fix_apt_sources_jammy.sh 并赋予执行权限 (chmod +x fix_apt_sources_jammy.sh) 后运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#!/bin/bash

# 脚本名称: fix_apt_sources_jammy.sh
# 功能: 自动修复 Ubuntu 22.04 (Jammy) 的 APT 源配置问题
# 支持官方源及多个国内镜像源(阿里云、华为云、清华、中科大)
# 使用方法: ./fix_apt_sources_jammy.sh

set -e # 遇到错误立即退出

EXPECTED_CODENAME="jammy"
CURRENT_CODENAME=$(lsb_release -cs 2>/dev/null || echo "unknown")

if [[ "$CURRENT_CODENAME" != "$EXPECTED_CODENAME" ]]; then
echo "⚠️ 警告: 此脚本设计用于 Ubuntu $EXPECTED_CODENAME ($EXPECTED_CODENAME),但检测到您的发行版代号是 '$CURRENT_CODENAME'。"
read -p "是否继续? (y/N): " confirm && [[ $confirm == [yY] ]] || exit 1
fi

echo "🔍 开始修复 Ubuntu $EXPECTED_CODENAME 的 APT 源配置..."

# 备份当前 sources.list 文件
BACKUP_FILE="/etc/apt/sources.list.backup.$(date +%Y%m%d_%H%M%S)"
echo "📁 正在备份当前配置到 $BACKUP_FILE ..."
sudo cp /etc/apt/sources.list "$BACKUP_FILE"

# 获取系统架构
ARCH=$(dpkg --print-architecture)
echo "🖥️ 检测到系统架构: $ARCH"

# 定义源列表
# 注意 Jammy 的安全更新地址可能不同
declare -A SOURCES=(
["官方源"]="http://archive.ubuntu.com/ubuntu/"
["阿里云"]="https://mirrors.aliyun.com/ubuntu/"
["华为云"]="https://mirrors.huaweicloud.com/repository/ubuntu/"
["清华大学"]="https://mirrors.tuna.tsinghua.edu.cn/ubuntu/"
["中科大"]="https://mirrors.ustc.edu.cn/ubuntu/"
)

# 创建临时 sources.list 内容
# Jammy 的安全更新路径与 Noble 相同
generate_source_list() {
local base_url=$1
cat << EOF
# Ubuntu $EXPECTED_CODENAME (jammy) - $(basename "$base_url")
deb $base_url jammy main restricted universe multiverse
deb $base_url jammy-updates main restricted universe multiverse
deb $base_url jammy-security main restricted universe multiverse
deb $base_url jammy-backports main restricted universe multiverse

# 源码包(可选)
# deb-src $base_url jammy main restricted universe multiverse
# deb-src $base_url jammy-updates main restricted universe multiverse
# deb-src $base_url jammy-security main restricted universe multiverse
# deb-src $base_url jammy-backports main restricted universe multiverse
EOF
}

# 测试源的函数
test_source() {
local url=$1
echo "🧪 正在测试源: $url"
# 创建临时 sources.list 文件进行测试
generate_source_list "$url" > /tmp/test_sources.list
# 替换为临时源以进行测试
sudo cp /tmp/test_sources.list /etc/apt/sources.list

# 执行 apt update 并捕获输出和返回值
output=$(sudo apt update 2>&1)
retval=$?

if [ $retval -eq 0 ]; then
echo "✅ 测试成功: $url 可用"
return 0
else
echo "❌ 测试失败: $url 不可用"
# echo "$output" # 如果需要详细错误信息可以取消注释
return 1
fi
}

# 主逻辑:遍历源列表进行测试
FOUND_WORKING_SOURCE=false
for name in "${!SOURCES[@]}"; do
if test_source "${SOURCES[$name]}"; then
FOUND_WORKING_SOURCE=true
echo "🎉 成功找到可用源: $name (${SOURCES[$name]})"
break
fi
done

# 清理临时文件
rm -f /tmp/test_sources.list

# 结果处理
if [ "$FOUND_WORKING_SOURCE" = true ]; then
echo "✅ APT 源已成功更新并验证。"
echo "💡 如需恢复原始配置,请执行:"
echo " sudo mv $BACKUP_FILE /etc/apt/sources.list && sudo apt update"
else
echo "❌ 所有预定义源均无法访问。请检查网络连接或稍后再试。"
echo "🔄 正在恢复原始 sources.list 配置..."
sudo mv "$BACKUP_FILE" /etc/apt/sources.list
echo "🔄 已恢复原始配置。"
exit 1
fi

echo "🏁 APT 源修复完成。"

如何使用

  1. 下载/创建脚本: 将上面的相应代码块复制粘贴到一个新的文本文件中,并命名为 fix_apt_sources_noble.shfix_apt_sources_jammy.sh
  2. 添加执行权限:
    1
    2
    3
    chmod +x fix_apt_sources_noble.sh
    # 或
    chmod +x fix_apt_sources_jammy.sh
  3. 运行脚本:
    1
    2
    3
    ./fix_apt_sources_noble.sh
    # 或
    ./fix_apt_sources_jammy.sh

这些脚本将会:

  • 检查系统版本。
  • 自动备份原始的 /etc/apt/sources.list 文件。
  • 依次测试预设的不同镜像源(包括官方源)。
  • 一旦发现一个可用的源,就会将其设置为新的 sources.list 内容。
  • 如果所有源都不可用,则会回滚到原始配置。

Ubuntu源配置修复
http://example.com/2025/12/22/Ubuntu版本源配置修复/
作者
muchenH
发布于
2025年12月22日
许可协议