Alpine 源代码地图(按启动顺序)
Alpine 源代码地图(按启动顺序)
![]() 备用消息。 |
Alpine 有许多不同的运行模式/环境。在这里,我尝试描述我通过追踪源代码所学到的知识。
启动顺序
Alpine 的典型启动顺序是
- 硬件 BIOS
- 启动加载器 (syslinux 的 isolinux)
- Initramfs (linux-grsec)
- 内核 (linux-grsec)
- Init 系统 (openrc)
- Shell (busybox 的 ash)
对于嵌入式系统
- 启动加载器 (UBOOT)
- 内核
- Init 系统
- Shell
对于 Docker
- Shell (Docker 镜像 https://hub.docker.com/_/alpine/)
syslinux
syslinux 的 'syslinux.cfg' 位于 https://github.com/alpinelinux/alpine-iso/blob/master/Makefile
initramfs
您可以使用 gzip -dc initramfs-grsec|cpio -vid
解压它。您可以删除 'quiet' 并在内核启动选项中添加 'debug' 标志以显示更多调试信息。init 的源代码可以在 apk info -W /usr/share/mkinitfs/initramfs-init
中找到 https://github.com/alpinelinux/mkinitfs
linux-grsec
将内核包打包到 ISO 文件的方法位于 https://github.com/alpinelinux/alpine-iso/blob/master/Makefile。
内核的源代码位于 linux-grsec
openrc
Alpine 定制脚本位于 https://github.com/alpinelinux/aports/tree/master/main/openrc
- /etc/inittab https://github.com/alpinelinux/aports/blob/master/main/alpine-baselayout/inittab
- /etc/runlevels/boot/bootmisc https://github.com/OpenRC/openrc/blob/master/init.d/bootmisc.in
shell
通过 'apk info -W /etc/profile',我们知道默认 profile 在 alpine-baselayout 中定制 https://github.com/alpinelinux/aports/tree/master/main/alpine-baselayout
开发者环境
在 Docker 中追踪代码
在任何现代 Linux 发行版中,运行 Docker 都会让您获得相同的开发者环境。
docker run -it --name alpine alpine /bin/sh
在 Docker 内部创建构建/开发环境
apk update apk add tmux vim diffutils # my tools apk add alpine-sdk xorriso syslinux adduser YOUR_ID # There are some build scripts can't work under 'root' account. su - YOUR_ID abuild-keygen -i -a
构建一个软件包示例(例如 openrc)
git clone https://github.com/alpinelinux/aports cd aports/main/openrc # change this line to the package which you want to change abuild -r ls -l ~/packages/x86_64/openrc*
当您关闭 PC 时,您可以通过以下方式重新调用 Docker 'alpine' 容器
docker start alpine docker attach alpine
测试
- 测试 ISO 文件
qemu-system-x86_64 -enable-kvm -localtime -m 512M -vga std \ -drive file=YOUR_ISO_FILE ,cache=none,if=virtio
- 在 Docker 中测试软件包
为了确保您获得与默认软件包环境相同的环境,只需使用 Docker 即可。
docker run --it --rm --name alpine-test alpine /bin/sh apk update
# on other window copy your new apk into the 'alpine-test' container docker cp foo.apk alpine-test:/tmp
# back to 'alpine-test' container apk fix /tmp/foo.apk