Install Alpine on Rackspace

From Alpine Linux
Revision as of 13:30, 26 July 2013 by Jbilyk (talk | contribs) (add first version)
This material is work-in-progress ...

Do not follow instructions here until this notice is removed.
(Last edited by Jbilyk on 26 Jul 2013.)

THIS IS A WIP, AND WAS JUST COPIED FROM INSTALLING ALPINE ON EC2

Create a minimal rackspace server

Debian 7 512MB, 20GB


Create apk overlay suitable for hard disk based tmpfs boot

The first step is to create Alpine configuration file with basic configuration of the host. We need the new box to start networking and ssh in the beginning so we can reconnect to it after reboot.

Create basic layout for the overlay:

mkdir overlay
cd overlay
mkdir -p etc/ssh etc/network etc/runlevels/{default,boot,sysinit,shutdown} root/.ssh etc/lbu

You can also use default Alpine configuration files. In this case you should use ssh key to authorize yourself (as root password is empty, and ssh has empty passwords disabled).

If you want to keep the existing host identity (e.g. SSH key), you can copy them over:

cp -a /etc/{passwd,group,shadow,gshadow,hostname,resolv.conf,network/interfaces,ssh} etc/
cp /etc/network/interfaces etc/network

Copy over your ssh authorized_keys and make sure its included in future:

cp -a /root/.ssh/authorized_keys root/.ssh
echo "/root/.ssh" > etc/lbu/include


Find out which shell is used for root:

grep ^root /etc/passwd

If its /bin/sh, you are good. If not, edit etc/passwd and change it to /bin/sh.

sed -i -e '/^root:/s:/bin/bash:/bin/sh:' etc/passwd
Note: If you don't do this, nobody (even with physical access) will be able to log into the machine.

Make sure there is no whitespace at end of lines in interfaces file. Busybox ifup is very picky.


Make sure your etc/resolv.conf exists; if not create etc/resolv.conf with the nameserver configuration like:

nameserver dns.ip.ad.dr

Create the apk world (var/lib/apk/world) with essential packages:

mkdir -p var/lib/apk
echo "alpine-base iproute2 openssh bash" > var/lib/apk/world

(bash is technically not needed, but include it in case you forgot to edit your etc/passwd file correctly)

Double check the IP configuration and ssh keys.

Finally, make the essential services start up automatically and create the overlay file:

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 *

Verify the overlay with "tar tzf" to see that it contains everything in proper places, and ensure it is in the / directory

tar tzvf host.apkovl.tar.gz
cp host.apkovl.tar.gz /

Install Alpine cd-rom image on hard disk

We need to copy over two sets of information: the boot kernel (kernel, initramdisk and boot configuration) and operating system boot data (overlay, apk packages and kernel modules). These can reside on same partition if they fit. However, /boot is usually small, so you might want to put the apks on separate partition. This guide assumes they are on sda1 (/boot) and sda2 (/) with both having ext3 filesystems. If you don't have ext3 on / or /boot, then you might be able to disable swap and reformat the swap partition as ext3 and use that.

Download an alpine iso and mount it; for example

 wget {{#latestalp:alpine|url}}
 mount alpine*.iso /cdrom -o loop

Copy the apkovl and the contents of cd-rom image to root of current installation:

cp host.apkovl.tar.gz /
cp -a /cdrom/* /

mkdir -p /boot/grub cat - >/boot/grub/grub.conf <<EOF default=0 timeout=3 hiddenmenu

title Alpine Linux root (hd0) kernel /boot/grsec alpine_dev=xvda1:ext4 modules=loop,squashfs,sd-mod,ext4 console=hvc0 pax_nouderef BOOT_IMAGE=/boot/grsec initrd /boot/grsec.gz EOF

  • Syslinux automatically adds BOOT_IMAGE to the kernel command line; grub does not, so make sure you specify it in the grub.conf
  • You do not need any other grub files - just boot.conf
  • symlink the grub.conf to menu.lst
ln -sf ./grub.conf /boot/grub/menu.lst










The goal here is to have a "1GB" (the smallest possible) EBS 'virtual usb stick' that can boot and run Alpine Linux.  

= Create an EBS backed Alpine Linux AMI =

{{Note|You need to do this process at least once in each availability region.  EBS can't be shared between Ireland and California, for instance.}}

* Create an Amazon instance in the desired availability region.  A micro instance is fine - we will need it only long enough to create our EBS usb stick.
* Create a new 1GB EBS volume 
* Attach the new volume to the running instance
* The new volume will have a name like /dev/xvdf or such
* Format the volume as ext4 {{Cmd|mke2fs -t ext4 /dev/xvdf}}  ''Do not partition it - just format the whole volume''
* wget a '''x86_64''' iso and extract it to the new volume. 32bit will not work. 
<pre>
wget http://dl-4.alpinelinux.org/alpine/v2.4/releases/x86_64/alpine-2.4.5-x86_64.iso
mkdir target
mkdir source
mount /dev/xvdf target
mount -o loop alpine-2.4.5-x86_64.iso source
cp -av source/boot target
cp -av source/apks target
umount source
  • Create a grub.conf on the new partition.
mkdir -p target/boot/grub
cat - >target/boot/grub/grub.conf <<EOF 
default=0
timeout=3
hiddenmenu

title Alpine Linux
root (hd0)
kernel /boot/grsec alpine_dev=xvda1:ext4 modules=loop,squashfs,sd-mod,ext4 console=hvc0 pax_nouderef BOOT_IMAGE=/boot/grsec
initrd /boot/grsec.gz
EOF
  • Syslinux automatically adds BOOT_IMAGE to the kernel command line; grub does not, so make sure you specify it in the grub.conf
  • You do not need any other grub files - just boot.conf
  • symlink the grub.conf to menu.lst
ln -sf ./grub.conf target/boot/grub/menu.lst
  • Create an amazon.apkovl.tar.gz file to put on the target
    • This is probably easiest on a local alpine linux instance. Make sure the following are configured:
      • eth0 uses dhcp
      • networking is set to autostart
      • sshd is installed and set to autostart
      • Your ssh public key is in /root/.ssh/authorized_keys
      • The root password is set to something
      • lbu include root/.ssh
      • (optional) - Delete the /etc/ssh/*key* files, so they are created on the new box
    • lbu package amazon.apkovl.tar.gz

      Warning: If you are packaging on a 32bit box, manually delete etc/apk/arch from the apkovl.tar.gz file

    • Copy amazon.apkovl.tar.gz to target/
  • Unmount target
  • Do the following from the Amazon web interface
    • Detach the new volume
    • Make note of the volume ID
    • Launch NEW instance. Use defaults, amazon linux, micro; we are going to canibalize it in a bit, so defaults are fine here.
    • Once the instance starts, stop but do not terminate the instance.
    • Under EBS, detach the existing volume, and attach the alpine linux volume as /dev/sda1 (note the 1 at the end)
    • Restart the instance
  • Log in and make sure it works
  • Do any final cleanups necessary, and if necessary lbu ci
    • Only make configs that are appropriate for an AMI, we are going to snapshot this instance and create an AMI out of it
  • Again from the Amazon web interface
    • Delete the 8GB volume that is no longer needed
    • Stop but do not terminate the instance
    • Right click the stopped instance and choose 'Create Image (EBS AMI)'
      • Image name should be unique for the image - example AlpineLinux-2.4.5
      • Description can be anything - example 'Base AlpineLinux Installation - no services'
  • Done.