Alpine 运维笔记
lsblk --output NAME,SIZE,VENDOR,FSTYPE,LABEL,UUID,MODE # 查看磁盘硬盘
lsblk -x NAME --output NAME,SIZE,VENDOR,FSTYPE,LABEL,UUID,MODE # 使用 NAME 排序
apk add wpa_supplicant e2fsprogs-extra
# 基础工具
apk add bash tar util-linux iproute2 curl busybox-extras file nano libc6-compat gcompat
bash
- *-bash-completion
- 其他的 bash 补全的包
# Bash
apk add shadow bash
usermod --shell /bin/bash admin
# 该步骤要求输入密码
# chsh root -s /bin/bash
# 补全
apk add bash-completion
# 加载补全
source /etc/profile.d/bash_completion.sh
替换 apk 仓库镜像
echo "http://mirrors.sjtug.sjtu.edu.cn/alpine/v$(sed -n 's/\.\d\+$//p' /etc/alpine-release)/main
http://mirrors.sjtug.sjtu.edu.cn/alpine/v$(sed -n 's/\.\d\+$//p' /etc/alpine-release)/community" > /etc/apk/repositories
apk update
manpages
- Alpine 默认不会安装 doc 和 man
- 所有的文档以 -doc 结尾
- 文档位于 /usr/share/man
- How to get regular stuff working
apk add --no-cache man man-pages mdocml-apropos less less-doc
export PAGER=less
# 安装和查看
apk add --no-cache curl-doc
man curl
# 或者直接使用 docker 便于查文档
docker run --rm -it wener/base:man
# 可以安装映射到主机
docker run --rm -it -v $PWD/man:/usr/share/man wener/base:man
基础运维
# 基础工具
apk add nano file grep htop rsync curl openssl
# 简化链接
apk add tmux mosh
# sshrc - https://github.com/Russell91/sshrc
# 依赖包
apk add vim tar coreutils openssl
# 证书
# /etc/ssl/certs/ca-certificates.crt
# 系统信息
apk add neofetch
系统运维
# 常用工具
apk add util-linux
# 扩展工具
apk add blkid cfdisk findmnt mcookie setpriv sfdisk
# 补全
apk add util-linux-bash-completion
# 信息查询工具
apk add lsof
硬件运维
apk add pciutils
apk add usbutils
apk add parted
apk add ddrescue
# dmidecode ownership vpddecode biosdecode
apk add dmidecode
setup-disk
# 制作系统盘
# swap 0
setup-disk -m sys -s 0 -v /dev/sda
# ==========
# 新系统检查项
# ==========
# 修改主机名
setup-hostname -n alpine-test
/etc/init.d/hostname --quiet restart
nano /etc/hosts
# 修改网络地址
nano /etc/network/interfaces
本地仓库
ARCH=$(apk print --print-arch)
REPO=$PWD/repo
mkdir -p $REPO/$ARCH
apk fetch -vRo $REPO/$ARCH nano
# 可以指定仓库
apk fetch -vRo $REPO/$ARCH -X http://mirrors.aliyun.com/alpine/edge/main --no-cache linux-firmware-brcm
# 创建索引
# 这里的 APKINDEX 是未签名的
apk index -o $REPO/$ARCH/APKINDEX.tar.gz $REPO/$ARCH/*.apk
apk -X $REPO update --allow-untrust
apk -X $REPO search --allow-untrust nano
容器
# Docker
apk add docker
rc-update add docker
磁盘扩展
# 扩展分区
# 假设分区结构为: boot,swap,root,空闲
# 删除最后一个分区, 再创建最后一个分区, 确保起点位置不变
# F 可以看到空余空间
# 手动分区
# fdisk /dev/sda
# 或直接分区
apk add util-linux
echo -e 'd\n\nn\n\n\n\n\n\np\nw\n' | fdisk /dev/sda
# 重启
# 不重启应该也是可以的 - ext4 支持在线扩容
# reboot
# 扩展文件系统
apk add e2fsprogs-extra
resize2fs /dev/sda2
# 检查结果
df -h /
# parted 也可以
parted /dev/sdb resize 1 1 200M
parted /dev/sdb resizepart 1 400M
resize2fs /dev/sdb1 400M
udev
- Gentoo Eudev
# 设置 /dev/disk
apk add udev-init-scripts
# OpenRC compatible fork of systemd-udev
apk add eudev
# init: udev udev-trigger udev-postmount udev-settle
rc-update add udev sysinit
rc-update add udev-trigger sysinit
# 如果想要立即启用
rc-service udev start
rc-service udev-trigger start
udevadm trigger
# 该包会影响网卡名字
# 会添加 /lib/udev/rules.d/80-net-name-slot.rules
# 需要参数 net.ifnames=0 来关闭
# 大多数时候不需要
# apk add eudev-netifnames
# 所有定义的规则
udevadm info --export-db
zfs
- 先安装 udev 环境
- 使用 zfs 时最好使用 uuid, 因为名字可能会发生变化
- 0.6 时, 导致直接系统重启
- 0.6 的 init 不是 openrc 的脚本, 启动会警告
apk add zfs zfs-{scripts,udev}
# 区分 lts, virt
apk add zfs-lts
# 加载内核模块
modprobe zfs
echo zfs > /etc/modules-load.d/zfs
# init: zfs-import zfs-mount zfs-share zfs-zed
rc-update add zfs-import sysinit
rc-update add zfs-mount sysinit
# 立即启动
rc-service zfs-import start
rc-service zfs-mount start
# 检测是否正常
zpool status
# 查看磁盘量
parted --list
# 查看现有磁盘 UUID
# 依赖于 udev
# 一般会有 ata, scsi, wwn 前缀之类
ls -lh /dev/disk/by-id/
# 只看主盘
ls -lh /dev/disk/by-id/ | grep 'sd.$'
# -f 强制创建, 避免 Does not contain an EFI label 错误
# -o ashift=12 使用高级磁盘格式
# -m /mnt/data 指定挂载点, 不指定则默认挂载为 /<pool>
# p1 Pool 的名字
# raidz 使用 RADI-Z 冗余
zpool create -f -o ashift=12 -m /mnt/data p1 \
raidz \
ata-VBOX_HARDDISK_VB63cffc10-3a66b288 \
ata-VBOX_HARDDISK_VBfb21373d-56cc6c57 \
ata-VBOX_HARDDISK_VB91ae7aad-d4a73895
# 查看状态
zpool status
# pool: p1
# state: ONLINE
# scan: none requested
# config:
#
# NAME STATE READ WRITE CKSUM
# p1 ONLINE 0 0 0
# raidz1-0 ONLINE 0 0 0
# ata-VBOX_HARDDISK_VB63cffc10-3a66b288 ONLINE 0 0 0
# ata-VBOX_HARDDISK_VBfb21373d-56cc6c57 ONLINE 0 0 0
# ata-VBOX_HARDDISK_VB91ae7aad-d4a73895 ONLINE 0 0 0
#
# errors: No known data errors
# 此时可以重 启测试看看 pool 是否还在
zpool status -x
# 将 scrub 作为周期性任务
# 一般一两周一次, 至少一月一次
echo '#!/bin/sh -
zpool scrub main
' > /etc/periodic/monthly/zfs-scrub
chmod +x /etc/periodic/monthly/zfs-scrub
service crond start
rc-update add crond
# 测试 crond
# busybox 的 run-parts 功能较少
apk add run-parts
run-parts /etc/periodic/monthly -v --report
uninstall zfs
# 销毁使用的 pool
zpool destroy pool
# 停止 service
rc-service zfs-import stop
rc-service zfs-mount stop
# 移除 init
rc-update del zfs-import sysinit
rc-update del zfs-mount sysinit
# 移除内核模块
modprobe -r zfs
btrfs
-
kernel btrfs
- btrfs.5
- Status
- Mount options
- Incremental Backup
- FAQ
- Gotchas
- 不建议使用 RAID5, RAID6
- Using Btrfs with Multiple Devices
-
Debian Btrfs
- 不要使用 4.11.x
- quotas 和 qgroups 有问题
- subvol 不能够被挂在为不同的选项
- compress=lzo 可能比较危险
- -o compress 可能会放大碎片
-
Archlinux Btrfs
-
raid0, raid1, raid5, raid6, raid10, dup, single
# 辅助程序
apk add btrfs-progs
apk add btrfs-progs-extra
# 补全
apk add btrfs-progs-bash-completion
# 加载内核模块
modprobe btrfs
# 确保启动时加载
echo btrfs >> /etc/modules
# 加载模块后会生成, 如果没有可以手动创建
# mknod /dev/btrfs-control c 10 234
# -M 混合元数据和数据, 适用于小数据, 数据大了过后磁盘布局不可预见
# -L 指定标签
# -U 可手动指定 UUID, 避免修改 fstab
# -O 指定特性
mkfs.btrfs --help
# 查看支持的特性
mkfs.btrfs -O list-all
# mixed-bg - mixed data and metadata block groups (0x4, compat=2.6.37, safe=2.6.37)
# extref - increased hardlink limit per file to 65536 (0x40, compat=3.7, safe=3.12, default=3.12)
# raid56 - raid56 extended format (0x80, compat=3.9)
# skinny-metadata - reduced-size metadata extent refs (0x100, compat=3.10, safe=3.18, default=3.18)
# no-holes - no explicit hole extents for files (0x200, compat=3.14, safe=4.0)
# a.b.c.d 做 raid 1
# 这几个设备的 uuid 会变成一样
mkfs.btrfs -d raid1 -m raid1 /dev/sd{a,b,c,d}
# 此时可以将任意一个设备进行挂载
mount /dev/sda /mnt/main/
# 设备扫描
btrfs device scan
# 查看文件系统
btrfs filesystem show
# 查看使用量
btrfs fi df /data
# 执行 scrub
# https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-scrub
# 结果会存储于 /var/lib/btrfs/
btrfs sc start /data
# 查看执行状态
btrfs sc status /data
# 执行 check
# check or repair a btrfs filesystem
# https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-check
# 不建议执行在线检测
# 自动挂载需要修改 /etc/fstab
echo "UUID=$(blkid -s UUID -o value /dev/sda) /data btrfs defaults 0 0" >> /etc/fstab
failed to read the system array
- 会导致启动时挂载失败
[ 1985.671707] BTRFS info (device sde): disk space caching is enabled
[ 1985.671712] BTRFS info (device sde): has skinny extents
[ 1985.675608] BTRFS error (device sde): failed to read the system array: -5
[ 1985.731217] BTRFS error (device sde): open_ctree failed
# 从新扫描后挂载
btrfs dev scan
mount -a
# 如果还不行可以尝试
btrfs rescue zero-log /dev/sde
mount -a