引言:为什么在 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 <