A script to install alpine linux on a dedicated server. Tested on Hetzner, Kimsufi / OVH
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
set -ex | |
PATH=/bin:/sbin:/usr/bin:/usr/sbin | |
KEYMAP="us us" | |
HOST=alpine | |
USER=anon | |
ROOT_FS=ext4 | |
BOOT_FS=ext4 | |
FEATURES="ata base ide scsi usb virtio $ROOT_FS" | |
MODULES="sd-mod,usb-storage,$ROOT_FS" | |
REL=3.6 | |
MIRROR=http://dl-cdn.alpinelinux.org/alpine | |
REPO=$MIRROR/v$REL/main | |
APKV=2.7.2-r0 | |
DEV=/dev/sdb | |
ROOT_DEV=${DEV}2 | |
BOOT_DEV=${DEV}1 | |
ROOT=/mnt | |
BOOT=/mnt/boot | |
ARCH=$(uname -m) | |
sgdisk -Z $DEV | |
sgdisk -n 1:0:+512M $DEV | |
sgdisk -t 1:8300 $DEV | |
sgdisk -c 1:boot $DEV | |
sgdisk -n 2:0:+20G $DEV | |
sgdisk -t 2:8300 $DEV | |
sgdisk -c 2:root $DEV | |
sgdisk -A 1:set:2 $DEV | |
mkfs.$BOOT_FS -m 0 -q -L boot $BOOT_DEV | |
mkfs.$ROOT_FS -q -L root $ROOT_DEV | |
mount $ROOT_DEV $ROOT | |
mkdir $BOOT | |
mount $BOOT_DEV $BOOT | |
curl -s $MIRROR/v$REL/main/$ARCH/apk-tools-static-${APKV}.apk | tar xz | |
./sbin/apk.static --repository $REPO --update-cache --allow-untrusted --root $ROOT --initdb add alpine-base syslinux dhcpcd | |
cat << EOF > $ROOT/etc/fstab | |
$ROOT_DEV / $ROOT_FS defaults,noatime 0 0 | |
$BOOT_DEV /boot $BOOT_FS defaults 0 2 | |
EOF | |
echo $REPO > $ROOT/etc/apk/repositories | |
cat /etc/resolv.conf > $ROOT/etc/resolv.conf | |
cat << EOF > $ROOT/etc/update-extlinux.conf | |
overwrite=1 | |
vesa_menu=0 | |
default_kernel_opts="quiet" | |
modules=$MODULES | |
root=$ROOT_DEV | |
verbose=0 | |
hidden=1 | |
timeout=1 | |
default=grsec | |
serial_port= | |
serial_baud=115200 | |
xen_opts=dom0_mem=256M | |
password='' | |
EOF | |
cat << EOF > $ROOT/etc/network/interfaces | |
auto lo | |
iface lo inet loopback | |
auto eth0 | |
iface eth0 inet dhcp | |
hostname $HOST | |
EOF | |
mount --bind /proc $ROOT/proc | |
mount --bind /dev $ROOT/dev | |
mount --bind /sys $ROOT/sys | |
chroot $ROOT /bin/sh -x << CHROOT | |
apk update | |
apk add openssh | |
setup-hostname -n $HOST | |
rc-update -q add devfs sysinit | |
rc-update -q add dmesg sysinit | |
rc-update -q add mdev sysinit | |
rc-update -q add hwdrivers sysinit | |
rc-update -q add hwclock boot | |
rc-update -q add modules boot | |
rc-update -q add sysctl boot | |
rc-update -q add hostname boot | |
rc-update -q add bootmisc boot | |
rc-update -q add syslog boot | |
rc-update -q add networking boot | |
rc-update -q add urandom boot | |
rc-update -q add dhcpcd boot | |
rc-update -q add mount-ro shutdown | |
rc-update -q add killprocs shutdown | |
rc-update -q add savecache shutdown | |
rc-update -q add acpid default | |
rc-update -q add crond default | |
rc-update -q add sshd default | |
echo features=\""$FEATURES"\" > /etc/mkinitfs/mkinitfs.conf | |
apk add linux-grsec | |
extlinux -i /boot | |
dd bs=440 conv=notrunc count=1 if=/usr/share/syslinux/gptmbr.bin of=$DEV | |
CHROOT | |
chroot $ROOT passwd | |
chroot $ROOT adduser -s /bin/ash -D $USER | |
chroot $ROOT passwd $USER | |
umount $ROOT/proc | |
umount $ROOT/dev | |
umount $ROOT/sys | |
umount $BOOT | |
umount $ROOT |
I have got a tar file in root of alpine ISO. During the installation of Alpine i want to extract the folder to /user/sbin. Where should i add the tar command to extract the tar file ?
How do you use this script ?
Update for Alpine Linux 3.9, adapted and tested on Kimsufi (installed from NetBoot: rescue):
#!/bin/sh
set -ex
PATH=/bin:/sbin:/usr/bin:/usr/sbin
KEYMAP="us us"
HOST=alpine1
USER=obeone
ROOT_FS=ext4
BOOT_FS=ext4
FEATURES="ata base ide scsi usb virtio $ROOT_FS network"
MODULES="sd-mod,usb-storage,$ROOT_FS,e1000e"
REL=3.9
MIRROR=http://dl-cdn.alpinelinux.org/alpine
REPO=$MIRROR/v$REL/main
APKV=2.10.3-r1
DEV=/dev/sda
ROOT_DEV=${DEV}2
BOOT_DEV=${DEV}1
ROOT=/mnt
BOOT=/mnt/boot
ARCH=$(uname -m)
sgdisk -Z $DEV
sgdisk -n 1:0:+512M $DEV
sgdisk -t 1:8300 $DEV
sgdisk -c 1:boot $DEV
sgdisk -n 2:0:+20G $DEV
sgdisk -t 2:8300 $DEV
sgdisk -c 2:root $DEV
sgdisk -A 1:set:2 $DEV
mkfs.$BOOT_FS -m 0 -q -L boot $BOOT_DEV
mkfs.$ROOT_FS -q -L root $ROOT_DEV
mount $ROOT_DEV $ROOT
mkdir $BOOT
mount $BOOT_DEV $BOOT
curl -s $MIRROR/v$REL/main/$ARCH/apk-tools-static-${APKV}.apk | tar xz
./sbin/apk.static --repository $REPO --update-cache --allow-untrusted --root $ROOT --initdb add alpine-base syslinux dhcpcd
cat << EOF > $ROOT/etc/fstab
$ROOT_DEV / $ROOT_FS defaults,noatime 0 0
$BOOT_DEV /boot $BOOT_FS defaults 0 2
EOF
echo $REPO > $ROOT/etc/apk/repositories
cat << EOF > $ROOT/etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
EOF
cat << EOF > $ROOT/etc/update-extlinux.conf
overwrite=1
vesa_menu=0
default_kernel_opts="quiet"
modules=$MODULES
root=$ROOT_DEV
verbose=0
hidden=1
timeout=1
default=grsec
serial_port=
serial_baud=115200
xen_opts=dom0_mem=256M
password=''
EOF
cat << EOF > $ROOT/etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address XXX.XXX.XXX.YYY
netmask 255.255.255.255
broadcast XXX.XXX.XXX.255
gateway XXX.XXX.XXX.254
network XXX.XXX.XXX.0
EOF
mount --bind /proc $ROOT/proc
mount --bind /dev $ROOT/dev
mount --bind /sys $ROOT/sys
chroot $ROOT /bin/sh -x << CHROOT
apk update
apk add openssh
setup-hostname -n $HOST
rc-update -q add devfs sysinit
rc-update -q add dmesg sysinit
rc-update -q add mdev sysinit
rc-update -q add hwdrivers sysinit
rc-update -q add hwclock boot
rc-update -q add modules boot
rc-update -q add sysctl boot
rc-update -q add hostname boot
rc-update -q add bootmisc boot
rc-update -q add syslog boot
rc-update -q add networking boot
rc-update -q add urandom boot
rc-update -q add dhcpcd boot
rc-update -q add mount-ro shutdown
rc-update -q add killprocs shutdown
rc-update -q add savecache shutdown
rc-update -q add acpid default
rc-update -q add crond default
rc-update -q add sshd default
echo features=\""$FEATURES"\" > /etc/mkinitfs/mkinitfs.conf
apk add linux-vanilla
extlinux -i /boot
dd bs=440 conv=notrunc count=1 if=/usr/share/syslinux/gptmbr.bin of=$DEV
CHROOT
chroot $ROOT passwd
chroot $ROOT adduser -s /bin/ash -D $USER
chroot $ROOT passwd $USER
umount $ROOT/proc
umount $ROOT/dev
umount $ROOT/sys
umount $BOOT
umount $ROOT
How do you use this script ?
Boot up the machine in rescue boot mode and run the script. You have to correct the variables beforehand.
Update for Alpine Linux 3.9, adapted and tested on Kimsufi (installed from NetBoot: rescue):
Thanks for posting it! :)
I got a problem after updating my Alpine and rebooting the machine. It seems my networks config just isn't compatible with the Kimsufi network anymore.
Any one got the same problems ?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hey Demian,
this is a great peace of work, that helped me a lot getting alpine running. But as i am a complete alpine beginner (just converted from debian) i've got some misunderstandings according to this script. Maybe you can get a bit into details for some lines:
5 PATH=/bin:/sbin:/usr/bin:/usr/sbin
seems to be unused right?6 KEYMAP="us us"
unused?11 FEATURES="ata base ide scsi usb virtio $ROOT_FS"
I have added "raid" here to get my system booting. What exactly is that? Kernel modules? It has something to do with the RamFS. Can you explain that a little better?12 MODULES="sd-mod,usb-storage,$ROOT_FS"
Curiously, I don't have to specify any raid modules for the kernel here...44 ./sbin/apk.static --repository $REPO --update-cache --allow-untrusted --root $ROOT --initdb add alpine-base syslinux dhcpcd
At this point i added "mdadm" to be right there... or what do you think?49 cat << EOF > $ROOT/etc/update-extlinux.conf
Since I come from Debian Syslinux/Extlinux is totally new to me.84 rc-update -q add devfs sysinit
Where should I put mdadm? sysinit or boot?107 echo features=\""$FEATURES"\" > /etc/mkinitfs/mkinitfs.conf
Can you explain me the boot process step by step? After BIOS/UEFI has passed to the bootloader (syslinux)... initramfs -> then kernel from / partition? I ask because syslinux knows where to find the kernel... or does syslinux need the initramfs?It would be great if you could spent some time to give me some support and answer my questions. If you wish, I can post you my Raid-Version of your script. Its working pretty stable, although I do not understand why ;-)
Greetings
David