Alpine

Tips

# 计算块设备容量
echo $(blockdev --getsize64 /dev/sdb1)/1024/1024 | bc -l
apk add shadow
apk add bash
# 更换 shell 为 bash
chsh root -s /bin/bash
# 安装 neofetch
apk add --no-cache -X http://mirrors.aliyun.com/alpine/edge/community neofetch
# 有些环境下没有 neofetch 可以用screenfetch
apk add --no-cache -X http://mirrors.aliyun.com/alpine/edge/testing screenfetch

安装

# 制作启动盘
dd if=alpine.iso of=/dev/sdx
# https://wiki.alpinelinux.org/wiki/Alpine_setup_scripts
# 统一初始化
# 分为 keymap,hostname,interfaces,dns,timezone,proxy,disk,ntp,cache,lbu,apkrepos 等
setup-alpine
# 也可以分开设置, 建议先设置网卡和 sshd, 那么接下来的操作就可以在远程操作
# 网卡建议使用引导进行设置, 否则需要手动写配置文件
setup-interfaces
# 设置完网卡后可能需要重启网络服务
rc-service networking restart
setup-sshd -c openssh
# 默认情况下不允许 root 远程登陆
echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
rc-service sshd restart
# 设置一个密码, 以便于远程登陆
passwd
# 注意: 如果远程登陆说密码失效, 可能是时间问题, 先在服务器上开启 ntp 同步时间
# 立即同步时间 ntpd -dn -N -p pool.ntp.org
# 远程证书配置好过后可以考虑关闭远程密码登陆
echo 'PasswordAuthentication no' >> /etc/ssh/sshd_config
rc-service sshd restart
# 接下来就可以远程操作了
setup-hostname -n alpine-test
# 使设置的主机名生效
/etc/init.d/hostname --quiet restart
setup-keymap us us
setup-ntp -c busybox
setup-timezone -z Asia/Shanghai
# 添加仓库
# 安装时的安装包位于 /media/sdb/apks/
echo "http://mirrors.aliyun.com/alpine/v$(sed -n 's/\.\d\+$//p' /etc/alpine-release)/main
http://mirrors.aliyun.com/alpine/v$(sed -n 's/\.\d\+$//p' /etc/alpine-release)/community" >> /etc/apk/repositories
# testing 有些尚未发布的, 有时候会用到
echo "@testing http://mirrors.aliyun.com/alpine/edge/testing" >> /etc/apk/repositories
# 或者直接用 edge
echo "http://mirrors.aliyun.com/alpine/edge/main
http://mirrors.aliyun.com/alpine/edge/community
@testing http://mirrors.aliyun.com/alpine/edge/testing" >> /etc/apk/repositories
apk update
# 创建回答文件, 然后可直接编辑
setup-alpine -c ans
# 使用回答文件进行初始化
setup-alpine -f ans
# 存储设置
# =======
# 如果只是想直接装到 U 盘, 那么至少需要 setup-interfaces, setup-sshd(从远程方便操作, 可以粘贴复制), 添加仓库, 然后才能 setup-disk
# 因为 setup-disk 需要安装一些包
# -s 0 无交换区
# -v 详细输出
# -m 磁盘格式
# -k 内核 vanilla, varthardend, hardended
# https://pkgs.alpinelinux.org/packages?name=linux-*&branch=v3.7&arch=x86_64&maintainer=Natanael+Copa
# BOOT_SIZE 100m 启动分区大小, 一般安装完成后 20m 左右, 默认会给 100
setup-disk -m sys -s 0 -v /dev/sda
# apk add sfdisk e2fsprogs syslinux
# 其他的可选参数
# BOOTLOADER grub 或 syslinux
# MBR=/usr/share/syslinux/mbr.bin
# SYSROOT=/mnt
# ERASE_DISKS 可以设置成写入的磁盘, 就不会再进行询问
ROOTFS=btrfs BOOTFS=btrfs VARFS=btrfs DISKLABEL=alp-wen setup-disk -m sys -s 0 -v /dev/sda
# 使用 EFI
# DISKLABEL 为 gpt
# BOOTLOADER 为 grub
# 启动分区格式为 vfat
USE_EFI=1 setup-disk -m sys -s 0 -v /dev/sdb

acct linux-$KERNEL_FLAVOR alpine-base

DISKLABEL=gpt USE_EFI gpt,grub,boot-vfat

PREFIX=
. "$PREFIX/lib/libalpine.sh"
. "$PREFIX/lib/dasd-functions.sh"
MBR=${MBR:-"/usr/share/syslinux/mbr.bin"}
ROOTFS=${ROOTFS:-ext4}
BOOTFS=${BOOTFS:-ext4}
VARFS=${VARFS:-ext4}
BOOTLOADER=${BOOTLOADER:-syslinux}
DISKLABEL=${DISKLABEL:-dos}
# default location for mounted root
SYSROOT=${SYSROOT:-/mnt}
# machine arch
ARCH=$(apk --print-arch)

制作磁盘镜像

# 创建 2g 镜像
qemu-img create -f qcow2 virt.qcow2 2g
# 从 cd 启动安装到镜像盘
# 转发 22 到本地 2222
qemu-system-x86_64 -cdrom alpine-virt-3.7.0-x86_64.iso -boot b -hda virt.qcow2 -net nic -net user,hostfwd=tcp::2222-:22
# 启用网络
echo -e '\n\n' | setup-interface
rc-service networking restart
rc-u
# 配置 ssh 远程登陆
setup-sshd -c openssh
echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
rc-service sshd restart
# 设置密码为 root
echo 'root:root' | chpasswd
# 另外一个终端从本地 2222 进入
ssh [email protected] -p 2222
echo "http://mirrors.aliyun.com/alpine/v$(sed -n 's/\.\d\+$//p' /etc/alpine-release)/main
http://mirrors.aliyun.com/alpine/v$(sed -n 's/\.\d\+$//p' /etc/alpine-release)/community
@testing http://mirrors.aliyun.com/alpine/edge/testing" >> /etc/apk/repositories
apk update
# 安装到磁盘
setup-disk -m sys -s 0 /dev/sda
# 完毕关机
poweroff
# 从镜像启动
qemu-system-x86_64 -hda virt.qcow2 -net nic -net user,hostfwd=tcp::2222-:22
# 初始化配置
setup-hostname -n alpine-test
/etc/init.d/hostname --quiet restart
setup-keymap us us
setup-ntp -c busybox
setup-timezone -z Asia/Shanghai
# 常用包
apk add nano busybox-extras
# 结束配置
poweroff
# 压缩磁盘
# 可能会清除分区上的 boot 信息
# mv virt.qcow2 virt-backup.qcow2
# qemu-img convert -O qcow2 virt-backup.qcow2 virt.qcow2
# 附加配置 - Bash
# ============
# 默认为 ash, 修改为 bash
apk add shadow bash
echo root | chsh root -s /bin/bash
apk add bash-completion
source /etc/profile.d/bash_completion.sh
# 附加配置 - man
# ============
# 默认没有 manpages
# 安装时如果需要文档, 可以安装 包名-doc
apk add --no-cache man man-pages mdocml-apropos less less-doc
export PAGER=less
# 附加配置 - Docker
# ============
# 一般镜像都可以把 docker 做上, 因为非常常用
apk add docker
rc-update add docker
rc-service docker restart
# 修改镜像
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
rc-service docker restart
# 验证配置成功
docker info
# 附加配置 - neofetch
# ============
# 快速的查看当前环境
apk add --no-cache -X http://mirrors.aliyun.com/alpine/edge/community neofetch

Release

3.9

# 升级仓库之前可先升级本地包
apk update
apk upgrade
# 更新为 3.9 仓库
sed -ire 's/v\d\.\d/v3.9/g' /etc/apk/repositories
apk update
apk upgrade
sync

3.8

  • 3.8.0 2018-06-27
  • Support netboot on all architectures
  • Add arm64 (aarch64) Raspberry Pi image
  • Add support for Raspberry Pi 3 Model B+
  • Support ISO image on s390x (KVM installation)
  • End of support for hardened kernel (unofficial Grsecurity)
  • Support for Crystal language
  • Linux 4.14
  • Go 1.10
  • Node.js 8.11 (LTS)
  • Rust 1.26
  • Ruby 2.5
  • PHP 7.2
  • ghc 8.4
  • OCaml 4.06
  • R 3.5
  • JRuby 9.2
  • 拆分了 linux-firmware 子包, 可单独安装
  • 注意
    • 3.8 移除了 hardened 相关的 kernel, 之前版本安装的都需要做调整
    • 3.7 没有 linut-virt 只有 linut-virthardened 需要先更新仓库
# 更新为 3.8 仓库
sed -ire 's/v\d\.\d/v3.8/g' /etc/apk/repositories
# 更新仓库索引
apk update
# 3.8 内核切换
# ============
# 3.8 移除了 hardened 内核, 升级前先切换到非 hardened 内核版本
# 查看当前内核
apk info -vv | grep hardened
# 如果为 linux-virthardened 则安装 linux-virt
# 如果为 linux-hardened 则安装 linux-vanilla
# 如果不是 hardened 内核, 跳过
apk add linux-vanilla
# 如果有其他内核模块是 hardened 也需要安装对应的 vanilla 版本, zfs, drbd, spl, dahdi, 例如
# apk add zfs-vanilla spl-vanilla
# 移除 hardened 的启动菜单, 确保下次启动进入选择正确的内核
nano /boot/extlinux.conf
reboot
# 重启后移除旧的内核
apk del linux-hardened
# 如果有依赖需要一并移除, 例如
# apk del linux-hardened spl-hardened zfs-hardened
# 更新所有的包
apk upgrade
sync
reboot

3.7

sed -ire 's/v\d\.\d/v3.7/g' /etc/apk/repositories
apk update
# 在进行升级之前先更新 apk 工具
apk add --upgrade apk-tools
# 更新所有的包, --available 会强制更新包, 即便版本是一样的
apk upgrade --available
# 查看是否还有未升级的
apk version
# 内核可能由于依赖原因不会升级
apk info -r linux-hardened
# 将依赖的包进行统一升级即可
apk add --upgrade linux-hardened spl-hardened zfs-hardened
# 如果更新了内核, 则需要重启
sync
reboot

Mips

https://bugs.alpinelinux.org/issues/5643 https://patchwork.alpinelinux.org/bundle/Lochnair/mips-port/?state=*

搜索 mips https://github.com/alpinelinux/aports/blob/master/main/gcc/APKBUILD

USB

usbutils-008-r0
libusb-1.0.20-r0
libusb-dev-1.0.20-r0
libusb-compat-dev-0.1.5-r3
usbredir-doc-0.7-r2
usbredir-0.7-r2
usbredir-dev-0.7-r2
usbredir-server-0.7-r2
libgusb-0.2.9-r1
libgusb-dev-0.2.9-r1
libgusb-doc-0.2.9-r1
libusb-compat-0.1.5-r3
usb-modeswitch-doc-2.4.0-r0
usbutils-doc-008-r0
usb-modeswitch-2.4.0-r0
usb-modeswitch-udev-2.4.0-r0
hwdata-usb-0.282-r0

APKINDEX

Edge

  • https://wiki.alpinelinux.org/wiki/Edge
  • "edge" is under constant development so be careful using it in production. It is possible that bugs in "edge" could cause data loss or could break your system.

Kernal

Mirror

# 添加 -r iso --limit-rate=2m
wget -np -rNP repos --cut-dirs 1 -e robots=off -X latest-stable,edge http://mirrors.aliyun.com/alpine/
rsync \
--archive \
--update \
--hard-links \
--delete \
--delete-after \
--delay-updates \
--timeout=600 \
--exclude="*" \
--include=/mnt/disk2t/data/alpine/include.txt \
rsync://rsync.alpinelinux.org/alpine/ mirror/
rsync \
--archive \
--update \
--hard-links \
--delete \
--delete-after \
--delay-updates \
--timeout=600 \
rsync://mirrors.tuna.tsinghua.edu.cn/alpine/ mirror/
# 同步单个目录并显示进度
rsync \
--archive \
--update \
--hard-links \
--delete \
--delete-after \
--delay-updates \
--timeout=600 \
--progress \
rsync://mirrors.tuna.tsinghua.edu.cn/alpine/v3.7/ mirror/v3.7/
# 可同时同步另外一个目录以达到并发
# --bwlimit=KBPS 带宽限制
rsync \
--archive \
--update \
--hard-links \
--delete \
--delete-after \
--delay-updates \
--timeout=600 \
--bwlimit=5000 \
rsync://mirrors.tuna.tsinghua.edu.cn/alpine/v3.6/ mirror/v3.6/

rsync --archive --update --hard-links --delete --delete-after --delay-updates --timeout=600 ~/data/alpine/ [email protected]:/mnt/disk2t/data/alpine/

rsync --archive --update --hard-links --timeout=600 --progress --exclude-from .rsyncignore rsync://mirrors.tuna.tsinghua.edu.cn/alpine/ ./

/etc/periodic/hourly/alpine-mirror

#!/bin/sh
# make sure we never run 2 rsync at the same time
lockfile="/tmp/alpine-mirror.lock"
if [ -z "$flock" ] ; then
exec env flock=1 flock -n $lockfile "$0" "[email protected]"
fi
src=rsync://rsync.alpinelinux.org/alpine/
dest=/var/www/localhost/htdocs/alpine/
# uncomment this to exclude old v2.x branches
#exclude="--exclude v2.*"
mkdir -p "$dest"
/usr/bin/rsync \
--archive \
--update \
--hard-links \
--delete \
--delete-after \
--delay-updates \
--timeout=600 \
$exclude \
"$src" "$dest"
chmod +x /etc/periodic/hourly/alpine-mirror

FAQ

手动指定 DNS

  1. 直接修改 /etc/resolv.conf
  2. 修改网络配置
iface eth0 inet static
address 192.168.3.3
netmask 255.255.255.0
gateway 192.168.3.1
dns-search example.com
dns-nameservers 223.5.5.5 114.114.114.114
# 该命令来源于 openresolv
resolvconf -u