Difference between revisions of "Replacing non-Alpine Linux with Alpine remotely"

From Alpine Linux
Jump to: navigation, search
Line 50: Line 50:
Finally, make the essential services start up automatically and create the overlay file:
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/{hwclock,modules,sysctl,hostname,bootmisc,syslog} etc/runlevels/boot/
  ln -s /etc/init.d/{devfs,dmesg,mdev} etc/runlevels/sysinit/
  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/{networking,sshd} etc/runlevels/default/
  ln -s /etc/init.d/{mount-ro,killprocs,savecache} etc/runlevels/shutdown/
  ln -s /etc/init.d/{mount-ro,killprocs,savecache} etc/runlevels/shutdown/

Revision as of 07:06, 19 September 2009

Instructions to replace running Linux installation with Alpine Linux, remotely using ssh connection only.

Use alpine-1.9.0_rc4 or later.

CAUTION: Practice on a computer with physical access first. If something goes wrong, the remote box will very likely be left into unusable state.


  • SSH access to the remote box (needs to have SSH server running)
  • Alpine Linux supported hardware
  • Adventurous mind

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

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/

Copy over your ssh authorized_keys:

cp -a /root/.ssh/authorized_keys root/.ssh

Create /etc/network/interfaces with network configuration (unless it was previously copied over). It should look something like:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
      address ip.ad.dr.es
      gateway gw.ad.dr.es

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

And create /etc/resolv.conf with the nameserver configuratio 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" > var/lib/apk/world

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 finally the overlay with "tar tzf" to see that it contains everything in proper places.

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 hda1 (/boot) and hda2 (/) 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.

We start with the easy task. Place the overlay file and the "apks" directory from cd-rom image to root of current installation:

cp host.apkovl.tar.gz /
cp -a /cdrom/apks /
cp -a /cdrom/boot/grsec.cmg /

Next we make the Alpine Linux kernel bootable (requires syslinux) and use fdisk to mark the /boot partition as bootable (if not done already):

cp -a /cdrom/boot/grsec{,.gz} /boot
dd if=/usr/share/syslinux/mbr.bin of=/dev/hda   # on some older systems its /usr/lib/syslinux/mbr.bin
fdisk /dev/hda

Create /boot/extlinux.conf with contents like (alpine_dev needs special care, hard-disks are sd* in alpine due to new kernel and libata; you also need to check the filesystem type; kernel and initrd are relative to partition root):

timeout 20
prompt 1
default grsec
label grsec
  kernel /grsec
  append initrd=/grsec.gz alpine_dev=sda2:ext3 modloop=grsec.cmg modules=loop,cramfs,sd-mod,usb-storage,ext3 quiet

Finally make the /boot partition bootable by extlinux.

extlinux -i /boot

Install Alpine on hard-disk

Reboot the box. And wait for it to come alive again. If it doesn't, tough luck. So dry practice with local box, with as identical hardware as possible.

Once back in the box, we are running in Alpine Linux from tmpfs. So just do a regular installation of Alpine from network via ssh connection.

Edit /etc/apk/repositories to contain your favorite Alpine mirror or just:


Finally run:

/etc/init.d/modloop stop
apk update

After hard disk setup is complete, copy ssh_authorized_keys to hard disk.

Reboot once more, and you have the server with native Alpine hard disk installation.