Alpine Linux包管理apk

apk软件仓库

/etc/apk/repositories 配置文件中包含了软件仓库配置,默认是:

/media/sdb1/apks

检查 /media/sdb1/apks 目录可以看到有一个子目录 x86_64 ,在这个子目录下,有当前ISO镜像包含的本地常用的 .apk 软件包,也就是,即使没有互联网,通过 apk 命令就可以直接从这些本地软件包进行安装。

不过,如果要安装的软件包不在本地,需要通过因特网安装,则需要添加仓库配置。

https://mirrors.alpinelinux.org/ 可以获得官方Alpine Linux镜像网站,选择一个添加到配置 /etc/apk/repositories 中:

激活community仓库
1#/media/sda1/apks
2http://dl-cdn.alpinelinux.org/alpine/v3.22/main
3http://dl-cdn.alpinelinux.org/alpine/v3.22/community
4#http://dl-cdn.alpinelinux.org/alpine/edge/main
5#http://dl-cdn.alpinelinux.org/alpine/edge/community
6#http://dl-cdn.alpinelinux.org/alpine/edge/testing

备注

根据 /etc/alpine-release 配置可以知道本机的版本,所以对应选择 v3.22 (例如我现在2025年10月发行版)

main 只包含基础软件包,很多软件包都位于 community ,例如 libvirt-daemon / docker 等虚拟化软件

通常大多数软件不需要激活 edge 分支,

alpine linux升级到滚动版本 edge

有些软件包属于testing状态,没有包含在默认的 maincommnity 仓库中,例如 在Alpine Linux上安装Calibre 就会遇到报错:

安装软件包没有包含在仓库中报错
$ sudo apk add calibre
fetch https://dl-cdn.alpinelinux.org/alpine/v3.22/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.22/community/x86_64/APKINDEX.tar.gz
ERROR: unable to select packages:
  calibre (no such package):
    required by: world[calibre]

edge/testing仓库提供了 calibre软件包

升级到 edge 版本进行安装(我试了同时添加stable和edge的仓库,安装edge仓库中软件包虽然能安装成功,但是运行会报库文件无法找到错误):

  • /etc/apk/repositories 修订成 edge/testing 仓库:

/etc/apk/repositories 添加 edge/testing 仓库
#/media/sda1/apks
#http://dl-cdn.alpinelinux.org/alpine/v3.22/main
#http://dl-cdn.alpinelinux.org/alpine/v3.22/community
http://dl-cdn.alpinelinux.org/alpine/edge/main
http://dl-cdn.alpinelinux.org/alpine/edge/community
http://dl-cdn.alpinelinux.org/alpine/edge/testing
  • 执行更新:

一条命令完整更新alpine linux系统
apk -U upgrade

完成后提示如下:

大版本升级提示
...
usr_merge_nag.sh: * WARNING: The current system is not /usr-merged.
usr_merge_nag.sh: * You are encouraged to migrate manually to ensure system reliability.
usr_merge_nag.sh: *
usr_merge_nag.sh: * See https://alpinelinux.org/posts/2025-10-01-usr-merge.html for more
usr_merge_nag.sh: * details.
usr_merge_nag.sh: *
usr_merge_nag.sh: * You can disable this message by masking the usr-merge-nag package:
usr_merge_nag.sh: *   apk add '!usr-merge-nag'
完整升级
# 先完成完整的系统升级
apk upgrade -aU

# 安装转换脚本
apk add merge-usr

# 测试转换脚本(模拟运行,没有实际执行,实际上就是替换 usr 目录等链接)
merge-usr --dryrun

# 如果没有报错,则实际执行
merge-usr

# 卒后清理掉转换脚本
apk del merge-usr

更新系统

  • 配置了软件仓库之后,就可以更新软件包列表:

更新alpine linux的软件包列表
apk update

此时会提示信息:

更新alpine linux的软件包列表
fetch http://mirror.math.princeton.edu/pub/alpinelinux/v3.14/main/x86_64/APKINDEX.tar.gz
3.14.2 [/media/sdb1/apks]
v3.14.2-5-gd4163d4c6c [http://mirror.math.princeton.edu/pub/alpinelinux/v3.14/main]
OK: 4791 distinct packages available
  • 然后可以更新系统:

更新alpine linux系统
apk upgrade

也可以结合上述两个命令成一个命令:

一条命令完整更新alpine linux系统
apk -U upgrade
  • 如果只更新指定软件(例如busybox),则使用:

指定更新软件(例如busybox)
apk update
apk add --upgrade busybox

diskless模式更新内核

由于 diskless 模式是只读设备(或ISO镜像),不能直接更新boot文件,所以需要通过 setup-bootable 准备一个可写入boot设备

  • 添加 mkinitfs 包:

    apk add mkinitfs
    

如果要支持特殊文件系统,例如 btrfs ,则需要在 /etc/mkinitfs/mkinitfs.conf 中激活,然后再执行 lbu commit

ls /etc/mkinitfs/features.d
apk add nano
nano /etc/mkinitfs/mkinitfs.conf
lbu commit
  • 最后执行升级内核和boot环境:

    update-kernel /media/sdXY/boot/
    

apk添加软件包

使用 add 可以从软件仓库安装一个软件包,所有依赖的软件包也会同时安装。如果有多个仓库,则 add 命令会安装最新的 软件包:

apk add openssh
apk add openssh openntp vim

默认只使用 main 仓库,软件是非常核心的,通常会同时激活 community 仓库,见上文。

如果只是想从 edge/testing 仓库安装一个软件包,但是不修改软件仓库配置,可以使用如下命令:

apk add cfssl --update-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing/ --allow-untrusted

这里仓库名见上文repo配置。这里案例是 编译安装cfssl(Alpine Linux)

apk搜索软件包

  • 直接搜索软件包:

    apk search htop
    
  • 搜素并显示描述:

    apk search -v -d 'htop'
    
  • 列出所有软件包并且包含描述:

    apk search -v
    
  • 搜索也可以使用匹配方法:

    apk search -v 'php7*'
    

固定软件版本不升级

有时候需要保持某个软件包版本不随着系统升级而变化,可以使用类似:

apk add bash=5.0.0-r0

也可以使用一个主板本来hold:

apk add bash=~5.0

如果要解除版本锁定,则改为 >

apk add bash>5.0.0-r0

安装本地下载的软件包

  • 可以安装本地软件包类似如下:

    apk add --allow-untrusted /path/to/foo.apk
    apk add --allow-untrusted pkg1.apk pkg2.apk
    

删除软件包

  • 以下命令删除软件包:

    apk del pkgName
    apk del pkgName1 pkgName2
    

查找某个文件属于哪个软件包

  • 可以按照以下命令找出哪个软件包提供某个文件:

    apk info --who-owns /sbin/apk
    

基础软件安装

  • 默认最小化安装对于维护不是很方便,所以安装以下软件:

    # NFS客户端和服务
    apk add nfs-utils
    # 磁盘维护
    apk add lsblk cfdisk e2fsprogs
    # lspci等维护工具
    apk add pciutils
    # 下载工具
    apk add curl axel
    

参考