Arch Linux ARM 一键安装 YAY 助手脚本 轻松管理 AUR 软件包 解决依赖难题

引言:为什么在 Arch Linux ARM 上需要 YAY 助手脚本?
Arch Linux ARM 是一个优秀的轻量级 Linux 发行版,广泛运行在树莓派、Orange Pi 等嵌入式设备上。然而,作为 Arch Linux 的衍生版本,它继承了 Arch 的包管理优势,同时也面临着 AUR(Arch User Repository)软件包管理的挑战。AUR 是 Arch Linux 的社区软件仓库,包含了成千上万的软件包,但安装和管理这些软件包通常需要手动编译和处理复杂的依赖关系。
YAY 是一个优秀的 AUR 助手工具,它用 Go 语言编写,具有速度快、依赖处理智能、用户友好等优点。然而,在 Arch Linux ARM 上手动安装 YAY 往往需要多个步骤,包括安装构建工具、克隆源码、编译等,对于新手用户来说较为繁琐。因此,一个一键安装脚本可以大大简化这个过程,让用户轻松管理 AUR 软件包。
一、YAY 助手的核心优势
1.1 什么是 YAY?
YAY 是一个基于 Go 语言的 AUR 助手,它模拟了
pacman
的命令行接口,让用户可以像使用官方仓库一样方便地搜索、安装、更新和删除 AUR 软件包。与传统的
makepkg
手动编译方式相比,YAY 提供了以下核心优势:
依赖自动处理
:YAY 能自动解析 AUR 软件包的依赖关系,包括递归依赖
并行编译
:支持多线程编译,显著加快软件包构建速度
智能缓存
:自动管理编译缓存,避免重复下载和编译
用户友好
:提供交互式选择界面,方便处理软件包版本冲突
1.2 为什么需要一键安装脚本?
在 Arch Linux ARM 上安装 YAY 面临以下挑战:
架构兼容性
:ARM 架构(如 armv7h、aarch64)需要确保软件包支持
构建依赖
:需要安装
base-devel
组和 Go 语言环境
网络限制
:嵌入式设备可能网络环境不稳定
资源限制
:内存和存储空间有限,需要优化安装过程
一键脚本可以自动化这些步骤,减少用户出错概率,提高安装成功率。
二、一键安装脚本的设计与实现
2.1 脚本功能概述
我们设计的脚本将具备以下功能:
自动检测系统架构和版本
智能安装构建依赖
自动下载、编译和安装 YAY
提供安装验证和基本配置
支持卸载和回滚操作
2.2 完整脚本代码
以下是完整的 Arch Linux ARM 一键安装 YAY 脚本:
#!/bin/bash
# Arch Linux ARM 一键安装 YAY 助手脚本
# 作者: Arch ARM 社区
# 版本: 1.2.0
# 支持架构: armv7h, aarch64

# 颜色定义
RED=’\033[0;31m’
GREEN=’\033[0;32m’
YELLOW=’\033[1;33m’
BLUE=’\033[0;34m’
NC=’\033[0m’ # No Color

# 日志函数
log_info() {
echo -e “${BLUE}[INFO]${NC} $1”
}

log_success() {
echo -e “${GREEN}[SUCCESS]${NC} $1”
}

log_warning() {
echo -e “${YELLOW}[WARNING]${NC} $1”
}

log_error() {
echo -e “${RED}[ERROR]${NC} $1”
}

# 检查是否为 root 用户
check_root() {
if [[ $EUID -eq 0 ]]; then
log_error “请不要以 root 用户运行此脚本”
log_info “脚本会在需要时自动使用 sudo”
exit 1
fi
}

# 检测系统架构
detect_arch() {
local arch=$(uname -m)
case $arch in
armv7l|armv6l)
echo “armv7h”
;;
aarch64|arm64)
echo “aarch64”
;;
*)
log_error “不支持的架构: $arch”
exit 1
;;
esac
}

# 检查是否已安装 YAY
check_yay_installed() {
if command -v yay &> /dev/null; then
local version=$(yay -V | head -n1)
log_warning “YAY 已安装: $version”
echo “1”
else
echo “0”
fi
}

# 检查并安装构建依赖
install_build_deps() {
log_info “正在检查并安装构建依赖…”

# 检查 sudo 是否安装
if ! command -v sudo &> /dev/null; then
log_info “安装 sudo…”
sudo pacman -S –noconfirm sudo || {
log_error “安装 sudo 失败”
exit 1
}
fi

# 检查 base-devel 组
if ! pacman -Qg base-devel &> /dev/null; then
log_info “安装 base-devel 组…”
sudo pacman -S –noconfirm base-devel || {
log_error “安装 base-devel 失败”
exit 1
}
fi

# 检查 Go 语言环境
if ! command -v go &> /dev/null; then
log_info “安装 Go 语言…”
sudo pacman -S –noconfirm go || {
log_error “安装 Go 失败”
exit 1
}
fi

log_success “构建依赖安装完成”
}

# 获取当前用户
get_current_user() {
echo $(whoami)
}

# 创建临时构建目录
create_build_dir() {
local temp_dir=”/tmp/yay-build-$$”
mkdir -p “$temp_dir”
echo “$temp_dir”
}

# 下载并编译 YAY
build_and_install_yay() {
local build_dir=$1
local arch=$2
local user=$3

log_info “开始构建 YAY…”
log_info “构建目录: $build_dir”
log_info “目标架构: $arch”

cd “$build_dir” || {
log_error “无法进入构建目录”
exit 1
}

# 下载 YAY 源码
log_info “下载 YAY 源码…”
if ! git clone https://aur.archlinux.org/yay.git; then
log_error “下载源码失败,请检查网络连接”
exit 1
fi

cd yay || {
log_error “无法进入 yay 目录”
exit 1
}

# 修改 PKGBUILD 以支持 ARM 架构(如果需要)
log_info “检查 PKGBUILD 架构支持…”
if grep -q “arch=(‘x86_64’)” PKGBUILD; then
log_info “修改 PKGBUILD 支持 ARM 架构…”
sed -i “s/arch=(‘x86_64’)/arch=(‘x86_64’ ‘armv7h’ ‘aarch64’)/” PKGBUILD
fi

# 编译并安装
log_info “编译 YAY (这可能需要几分钟)…”
if command -v sudo &> /dev/null; then
makepkg -si –noconfirm || {
log_error “编译安装失败”
exit 1
}
else
log_error “sudo 未安装,无法继续”
exit 1
fi

log_success “YAY 编译安装完成”
}

# 验证安装
verify_installation() {
log_info “验证 YAY 安装…”

if ! command -v yay &> /dev/null; then
log_error “YAY 未找到,请检查安装过程”
return 1
fi

# 测试基本功能
log_info “测试 YAY 基本功能…”
if yay -Ss hello 2>/dev/null | grep -q “hello”; then
log_success “YAY 功能测试通过”
return 0
else
log_error “YAY 功能测试失败”
return 1
fi
}

# 配置 YAY
configure_yay() {
log_info “配置 YAY…”

# 创建配置目录
mkdir -p ~/.config/yay

# 显示当前配置
log_info “当前 YAY 配置:”
if [ -f ~/.config/yay/config.json ]; then
cat ~/.config/yay/config.json
else
log_info “使用默认配置”
fi

log_success “YAY 配置完成”
}

# 显示使用帮助
show_usage() {
echo
log_success “YAY 安装成功!”
echo
log_info “基本用法:”
echo ” yay -Ss <包名> # 搜索软件包”
echo ” yay -S <包名> # 安装软件包”
echo ” yay -R <包名> # 删除软件包”
echo ” yay -Syu # 更新系统和 AUR 包”
echo ” yay -Qs <包名> # 查询已安装的包”
echo
log_info “常用选项:”
echo ” –devel # 包含开发版软件包”
echo ” –timeupdate # 按时间更新”
echo ” –bottomup # 从 AUR 开始搜索”
echo
}

# 卸载 YAY
uninstall_yay() {
log_info “开始卸载 YAY…”

if ! command -v yay &> /dev/null; then
log_warning “YAY 未安装”
return 0
fi

# 卸载 YAY 包
log_info “卸载 YAY 包…”
sudo pacman -Rns yay –noconfirm || {
log_error “卸载失败”
return 1
}

# 清理构建目录
local build_dir=”/tmp/yay-build-*”
if ls $build_dir 1> /dev/null 2>&1; then
log_info “清理构建目录…”
rm -rf $build_dir
fi

log_success “YAY 卸载完成”
}

# 主安装流程
main_install() {
log_info “=== Arch Linux ARM YAY 一键安装脚本 ===”

# 检查 root
check_root

# 检查是否已安装
local installed=$(check_yay_installed)
if [ “$installed” = “1” ]; then
read -p “YAY 已安装,是否重新安装?(y/N): ” -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
log_info “取消安装”
exit 0
fi
uninstall_yay
fi

# 检测架构
local arch=$(detect_arch)
log_info “检测到架构: $arch”

# 获取当前用户
local user=$(get_current_user)
log_info “当前用户: $user”

# 安装构建依赖
install_build_deps

# 创建构建目录
local build_dir=$(create_build_dir)
log_info “创建构建目录: $build_dir”

# 构建并安装
build_and_install_yay “$build_dir” “$arch” “$user”

# 验证安装
if verify_installation; then
# 配置
configure_yay

# 显示使用帮助
show_usage

# 清理
log_info “清理构建目录…”
rm -rf “$build_dir”

log_success “=== 安装完成 ===”
else
log_error “安装验证失败,请检查错误信息”
exit 1
fi
}

# 卸载流程
main_uninstall() {
log_info “=== YAY 卸载脚本 ===”
uninstall_yay
}

# 显示帮助信息
show_help() {
echo “用法: $0 [选项]”
echo
echo “选项:”
echo ” install 安装 YAY (默认)”
echo ” uninstall 卸载 YAY”
echo ” help 显示此帮助信息”
echo
echo “示例:”
echo ” $0 install # 安装 YAY”
echo ” $0 uninstall # 卸载 YAY”
echo ” $0 help # 显示帮助”
echo
}

# 主程序入口
case “${1:-install}” in
install)
main_install
;;
uninstall)
main_uninstall
;;
help|–help|-h)
show_help
;;
*)
log_error “未知选项: $1”
show_help
exit 1
;;
esac
2.3 脚本核心逻辑详解
2.3.1 系统检测与兼容性处理
脚本首先进行系统检测,确保在正确的环境中运行:
# 架构检测逻辑
detect_arch() {
local arch=$(uname -m)
case $arch in
armv7l|armv6l)
echo “armv7h” # 转换为 PKGBUILD 使用的格式
;;
aarch64|arm64)
echo “aarch64”
;;
*)
log_error “不支持的架构: $arch”
exit 1
;;
esac
}
这个函数处理了不同 ARM 架构的命名差异,确保脚本在各种设备上都能正确运行。
2.3.2 智能依赖管理
脚本会检查并安装必要的构建依赖:
# 依赖检查逻辑
install_build_deps() {
# 检查 sudo
if ! command -v sudo &> /dev/null; then
sudo pacman -S –noconfirm sudo
fi

# 检查 base-devel 组
if ! pacman -Qg base-devel &> /dev/null; then
sudo pacman -S –noconfirm base-devel
fi

# 检查 Go
if ! command -v go &> /dev/null; then
sudo pacman -S –noconfirm go
fi
}
这种逐项检查的方式避免了重复安装,提高了脚本的执行效率。
2.3.3 源码编译与安装
脚本自动处理 YAY 的编译安装过程:
# 编译安装逻辑
build_and_install_yay() {
# 下载源码
git clone https://aur.archlinux.org/yay.git

# 修改 PKGBUILD 支持 ARM
sed -i “s/arch=(‘x86_64’)/arch=(‘x86_64’ ‘armv7h’ ‘aarch64’)/” PKGBUILD

# 编译安装
makepkg -si –noconfirm
}
这里特别处理了 PKGBUILD 的架构支持,确保在 ARM 设备上能够正常编译。
三、脚本使用指南
3.1 安装步骤
下载脚本
“`bash
使用 wget 下载
wget
https://example.com/install-yay.sh
-O install-yay.sh
# 或者使用 curl
curl -O
https://example.com/install-yay.sh
2. **赋予执行权限**
“`bash
chmod +x install-yay.sh
运行脚本
“`bash
安装 YAY
./install-yay.sh install
# 或者直接运行(默认安装)
./install-yay.sh
4. **验证安装**
“`bash
# 检查版本
yay -V

# 测试搜索
yay -Ss hello
3.2 卸载 YAY
如果需要卸载 YAY,可以运行:
./install-yay.sh uninstall
3.3 高级用法
3.3.1 自定义安装选项
你可以修改脚本中的变量来定制安装:
# 在脚本开头添加以下变量
YAY_REPO=”https://aur.archlinux.org/yay.git”
BUILD_DIR=”/tmp/yay-build”
MAKEPKG_OPTS=”-si –noconfirm”
3.3.2 离线安装支持
对于网络受限的环境,可以预先下载源码:
# 预下载源码
git clone https://aur.archlinux.org/yay.git yay-src
cd yay-src

# 修改 PKGBUILD
sed -i “s/arch=(‘x86_64’)/arch=(‘x86_64’ ‘armv7h’ ‘aarch64’)/” PKGBUILD

# 打包
makepkg -d

# 然后在目标设备上安装
sudo pacman -U yay-*.pkg.tar.zst
四、YAY 基本使用详解
4.1 软件包搜索与安装
4.1.1 搜索软件包
YAY 的搜索功能非常强大,支持模糊匹配和详细信息显示:
# 基本搜索
yay -Ss vim

# 搜索并显示详细信息
yay -Ss –info vim

# 只搜索 AUR
yay -Ss –aur vim

# 按更新时间排序
yay -Ss –timeupdate vim
搜索示例输出:
aur/vim-plug 0.11.0-1 (+2345 4.56)
Vim plugin manager
aur/neovim 0.9.0-1 (+1234 3.21)
Vim-fork focused on extensibility and usability
community/vim 9.0-2 (12.5 MiB)
Vi Improved, a highly configurable, improved vi text editor
4.1.2 安装软件包
# 安装单个软件包
yay -S vim-plug

# 安装多个软件包
yay -S neovim vim-plug

# 安装时不提示确认
yay -S –noconfirm vim-plug

# 安装后清理构建文件
yay -S –clean vim-plug
安装过程示例:
:: 检到 2 个软件包
:: 正在处理 1 个软件包的文件冲突
:: 正在安装 vim-plug…
(1/1) 解压中… [100%]
(1/1) 后处理中…
(1/1) 正在生成系统数据库…
:: 正在清理构建目录…
4.2 系统更新与管理
4.2.1 更新系统
# 更新系统和所有 AUR 包
yay -Syu

# 只更新 AUR 包
yay -Sua

# 更新时不检查 PKGBUILD 变更
yay -Syu –devel –timeupdate

# 更新并清理旧版本
yay -Syu –clean
4.2.2 查看可更新包
# 显示所有可更新包
yay -Qu

# 只显示 AUR 可更新包
yay -Qua

# 显示详细信息
yay -Qu –info
4.3 软件包查询
4.3.1 查询已安装包
# 查询已安装的包
yay -Qs vim

# 查询具体包的信息
yay -Qi vim

# 查询包的文件列表
yay -Ql vim

# 查询文件属于哪个包
yay -Qo /usr/bin/vim
4.3.2 查询 AUR 包
# 查询 AUR 包信息
yay -Si vim-plug

# 查询 AUR 包的依赖
yay -Si –depends vim-plug

# 查询 AUR 包的可选依赖
yay -Si –optdepends vim-plug
4.4 软件包删除
# 删除软件包
yay -R vim-plug

# 删除软件包及其依赖
yay -Rns vim-plug

# 删除软件包及其所有依赖(包括其他包需要的)
yay -Rsc vim-plug
4.5 高级功能
4.5.1 交互式选择
YAY 提供了交互式选择功能,特别适合处理多个版本:
# 安装时选择版本
yay -S python

# 输出示例:
:: 2 个软件包可供安装:
1) python 2) python-git
请选择 (1-2): 1
4.5.2 编译选项控制
# 使用自定义编译选项
yay -S –mflags=”–skippgpcheck” vim-plug

# 并行编译(加快速度)
yay -S –mflags=”-j$(nproc)” vim-plug

# 指定构建目录
yay -S –builddir=/tmp/build vim-plug
4.5.3 缓存管理
# 查看构建缓存
yay -Cc

# 清理所有构建缓存
yay -Scc

# 只清理旧版本缓存
yay -Scc –keep 2
五、常见问题与解决方案
5.1 安装问题
问题 1:依赖冲突
症状:
错误:无法准备事务处理 (无法满足依赖关系)
:: 安装 go (1.20) 会破坏依赖 ‘go<1.20' 解决方案: # 强制更新依赖 sudo pacman -Syu --force # 或者先移除冲突包 sudo pacman -Rns old-go sudo pacman -S go 问题 2:编译失败 症状: 错误:编译失败 make: *** [Makefile:123: all] Error 2 解决方案: # 检查构建日志 cat /tmp/yay-build-*/yay/src/yay-*/config.log # 清理后重试 rm -rf /tmp/yay-build-* ./install-yay.sh install 5.2 使用问题 问题 3:YAY 无法找到 AUR 包 可能原因: 网络连接问题 AUR 服务器维护 包名拼写错误 解决方案: # 测试网络连接 ping aur.archlinux.org # 检查 AUR 仓库状态 curl -s https://aur.archlinux.org/ | head -n 10 # 使用官方仓库验证包名 yay -Ss --aur exact包名 问题 4:依赖循环 症状: 错误:无法解决依赖关系 :: 循环依赖检测到 解决方案: # 使用 --skipinteg 跳过完整性检查 yay -S --skipinteg 包名 # 或者手动处理 yay -S --assume-installed=依赖包 包名 5.3 性能优化 优化 1:加快编译速度 # 编辑 makepkg.conf sudo nano /etc/makepkg.conf # 修改以下行: MAKEFLAGS="-j$(nproc)" COMPRESSXZ=(xz -c -z -T0 -) 优化 2:减少内存使用 # 限制并行编译线程数 export MAKEFLAGS="-j2" # 对于 1GB 内存的设备 # 使用更快的压缩算法 export PKGEXT='.pkg.tar.zst' 六、脚本的扩展与定制 6.1 添加新功能 你可以扩展脚本以支持更多功能: # 添加函数:安装特定版本的 YAY install_yay_version() { local version=$1 log_info "安装 YAY 版本: $version" cd "$build_dir/yay" git checkout "v$version" makepkg -si --noconfirm } # 添加函数:配置镜像源 configure_mirrors() { log_info "配置镜像源..." sudo tee /etc/pacman.d/mirrorlist > /dev/null <