远程将非 Alpine Linux 系统替换为 Alpine Linux
![]() 请随时帮助我们制作最新版本。(讨论) |

- 内容: 这些说明适用于从托管公司(如 serverpronto、bluehost 等)在托管的物理服务器上安装 Alpine Linux。
- 原因: 通常这些公司运行 Debian、Fedora 或其他 Linux 发行版。本文档解释了如何在只有 ssh 访问权限的机器上安装 Alpine Linux。
使用 VNC 访问
下载一个从 ram 启动的 alpine iso,例如 alpine-virt
wget dl-cdn.alpinelinux.org/alpine/v3.5/releases/x86_64/alpine-virt-3.5.2-x86_64.iso
将镜像刷入服务器的驱动器,例如 /dev/sda
dd if=alpine-virt-3.5.2-x86_64.iso of=/dev/sda
重启,并使用 root 再次从 vnc 登录。Alpine 现在正在从 ram 运行,并且应该已将 /dev/sda 挂载到 /media/sda,将其粘贴到 ram 中。
mkdir /media/setup cp -a /media/sda/* /media/setup
同时复制内核模块,它们位于 /.modloop 中
mkdir /lib/setup cp -a /.modloop/* /lib/setup
卸载 modloop 和 media 文件夹
rc-service modloop stop umount /dev/sda
将文件移回原位
mv /media/setup/* /media/sda/ mv /lib/setup/* /.modloop/
最后,您可以格式化磁盘以安装 alpine
setup-disk
或者直接运行整个安装程序
setup-alpine
不使用 VNC 访问


先决条件
- 对远程主机的 SSH 访问(需要运行 SSH 服务器)
- Alpine Linux 支持的硬件
- 冒险精神
- 钢铁般的神经
这些说明基于 debian(物理)服务器,所有步骤都在登录到机器时执行。因此,您应该从一台运行 ssh 的机器开始。
创建适用于基于硬盘 tmpfs 启动的 apk 覆盖
第一步是创建 Alpine 配置文件,其中包含主机的基本配置。我们需要新盒子在开始时启动网络和 ssh,以便我们可以在重启后重新连接到它。
为覆盖创建基本布局
mkdir overlay cd overlay mkdir -p etc/ssh etc/network etc/runlevels/{default,boot,sysinit,shutdown} root/.ssh etc/lbu
您也可以使用默认的 Alpine 配置文件。在这种情况下,您应该使用 ssh 密钥来授权自己(因为 root 密码为空,并且 ssh 已禁用空密码)。
如果您想保留现有的主机身份(例如 SSH 密钥),您可以将其复制过来
cp -a /etc/{passwd,group,shadow,gshadow,hostname,resolv.conf,network/interfaces,ssh} etc/ cp /etc/network/interfaces etc/network
复制您的 ssh authorized_keys 并确保将其包含在未来
cp -a /root/.ssh/authorized_keys root/.ssh echo "/root/.ssh" > etc/lbu/include
找出 root 使用哪个 shell
grep ^root /etc/passwd
如果是 /bin/ash,那就很好。如果不是,请编辑 etc/passwd 并将其更改为 /bin/ash。
sed -i -e '/^root:/s:/bin/bash:/bin/ash:' etc/passwd
创建包含网络配置的 etc/network/interfaces(除非之前已复制)。它应该看起来像
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address ip.ad.dr.es netmask 255.255.255.0 gateway gw.ad.dr.es
由于 Alpine 3.13 必须是
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address ip.ad.dr.es/cidr gateway gw.ad.dr.es
确保 interfaces 文件中行尾没有空格。Busybox ifup 非常挑剔。
确保您的 etc/resolv.conf 存在;如果不存在,请使用 nameserver 配置创建 etc/resolv.conf,例如
nameserver dns.ip.ad.dr options edns0 trust-ad single-request-reopen
使用基本软件包创建 apk world (etc/apk/world)
mkdir -p etc/apk echo "alpine-base iproute2 openssh" > etc/apk/world
仔细检查 IP 配置和 ssh 密钥。
最后,使基本服务自动启动并创建覆盖文件
ln -s /etc/init.d/{hwclock,modules,sysctl,hostname,bootmisc,syslog} etc/runlevels/boot/ ln -s /etc/init.d/{devfs,dmesg,mdev,hwdrivers} etc/runlevels/sysinit/ ln -s /etc/init.d/{networking,sshd} etc/runlevels/default/ ln -s /etc/init.d/{mount-ro,killprocs,savecache} etc/runlevels/shutdown/ tar czf ../host.apkovl.tar.gz *
使用 "tar tzf" 验证覆盖,以查看它是否包含所有正确位置的内容,并确保它位于 / 目录中
tar tzvf host.apkovl.tar.gz cp host.apkovl.tar.gz /
在硬盘上安装 Alpine cd-rom 镜像
我们需要复制两组信息:启动内核(kernel、initramdisk 和启动配置)和操作系统启动数据(overlay、apk 软件包和内核模块)。如果它们适合,它们可以驻留在同一分区上。但是,/boot 通常很小,因此您可能希望将 apks 放在单独的分区上。本指南假定它们位于 sda1 (/boot) 和 sda2 (/) 上,并且都具有 ext3 文件系统。如果您的 / 或 /boot 上没有 ext3,那么您或许可以禁用 swap 并将 swap 分区重新格式化为 ext3 并使用它。
下载 alpine iso 并挂载它;例如
wget {{#latestalp:alpine|url}} mount alpine*.iso /cdrom -o loop
将 apkovl 和 cd-rom 镜像的内容复制到当前安装的根目录
cp host.apkovl.tar.gz / cp -a /cdrom/* /
接下来,我们使 Alpine Linux 内核可启动(需要 syslinux)并使用 fdisk 将 /boot 分区标记为可启动(如果尚未完成)
dd if=/usr/share/syslinux/mbr.bin of=/dev/sda # on some older systems its /usr/lib/syslinux/mbr.bin fdisk /dev/sda
确保 /boot 目录具有指向自身的符号链接。这是为了处理 /boot 在单独分区上的情况。
ln -sf . /boot/boot
创建 /boot/extlinux.conf,内容如下(检查 alpine_dev 的文件系统类型;kernel 和 initrd 相对于分区根目录)
timeout 20 prompt 1 default grsec label grsec kernel /boot/grsec append initrd=/boot/grsec.gz alpine_dev=sda2:ext3 modloop=grsec.cmg modules=loop,cramfs,sd-mod,usb-storage,ext3 quiet
从 Alpine Linux 2.1 开始,您可以使用保存 apkovl 和apks目录(当前根目录)的分区的 UUID。使用blkid获取正确的 UUID。通过使用 UUID,我们解决了当存在多个磁盘且我们不知道内核在启动后如何枚举它们时的问题。extlinux.conf 示例
timeout 20 prompt 1 default grsec label grsec kernel /boot/grsec append initrd=/boot/grsec.gz alpine_dev=UUID=44ea33e2-deb4-4a29-88e2-fc8a4ef80ab0:ext3 modloop=grsec.cmg modules=loop,cramfs,sd-mod,usb-storage,ext3 quiet
[IceCodeNew 添加的评论]
我在 Ubuntu 20.04 上尝试了此说明,并且我正在安装 Alpine-virt 3.13.2。
我发现没有名为 `*/syslinux/mbr.bin` 的文件,但即使我跳过发出 `dd if=/usr/share/syslinux/mbr.bin of=/dev/sda` 的步骤,机器也能够毫无问题地启动 alpine。
这是我使用的 extlinux.conf(因为有很多文件已被重命名)
timeout 20 prompt 1 default grsec label grsec kernel /boot/vmlinuz-virt append initrd=/boot/initramfs-virt alpine_dev=UUID=db153994-91fe-426f-bd88-f751e07f97f2:ext4 modloop=/boot/modloop-virt modules=loop,cramfs,sd-mod,usb-storage,ext4 quiet
[评论结束]
最后,通过 extlinux 使 /boot 分区可启动。
extlinux -i /boot
(在 2.1.2 及更高版本上测试)确保
- grsec.cmg 在 / 上
- [something].apkovl.tar.gz 在 / 上
- grsec.gz 在 /boot 上
- apline_dev UUID 值指向当前 / 的位置
- /boot 的分区被标记为可启动
- extlinux 的输出是针对当前挂载在 /boot 的分区
在硬盘上安装 Alpine
重启盒子。等待它再次启动。如果它没有启动,那就没办法了。因此,请在本地盒子(硬件尽可能相同)上进行干练的练习。
一旦回到盒子中,我们就在从 tmpfs 运行的 Alpine Linux 中。因此,只需通过 ssh 连接从网络执行 Alpine 的常规安装即可。
编辑 /etc/apk/repositories 以包含您喜欢的 Alpine 镜像或只是
https://dl-cdn.alpinelinux.org/alpine/v3.18/main/
最后运行
rc-service modloop stop apk update setup-disk
硬盘设置完成后,将 ssh_authorized_keys 复制到硬盘。
再次重启,您就拥有了带有原生 Alpine 硬盘安装的服务器。