---
Title: How to install any distrib on a Gandi VPS
Date: 2021-11-18 08:51:00
Summary: I needed to install BBB, which requires Ubuntu 18.0.4, but they only had Ubuntu 20.0.4...
---

Currently [Gandi VPS](https://www.gandi.net/en/cloud/vps) don't
provide an image with Ubuntu Bionic, which is needed for example to
install BBB. So I started an in-memory Ubuntu on top of an Ubuntu to
install an Ubuntu...

If you land here from the future, and want to do the same, double
check, Gandi may have already implemented an object storage allowing
you to use any distrib, making the setup of alternative distribs way
easier.

The same process could be used to install any Debian based distrib, or
with some more modifications any other Linux distrib, don't hesitate
to play around.

It can also be used to setup your own partition scheme or use
encrypted partitions.

> ⚠ WARNING ⚠
>
> The probability you'll just brick your VPS once or twice before succeding is high.
> Don't do this on a VPS you care.
>
> In case of failure, just drop the VPS and start fresh.

Last thing before starting, since very recently there's an easier
alternative: you can use the « Rescue mode » and directly jump to the
`mkfs.ext4 /dev/xvda1` step.

OK, « en route » !!

The first step is to start a small Ubuntu (or Debian or whatever) in
memory, so we'll be able to destroy the real one, for this I used
[takeover.sh](https://github.com/marcan/takeover.sh), so SSH to your
VPS and:

First get root:

```bash
sudo su -
```

Then we'll create a new root, in memory, for the temporary distrib:

```bash
mkdir /takeover
mount -t tmpfs tmpfs /takeover -o size=2G  # Fully in RAM as we'll umount / later.
apt update; apt-get install debootstrap busybox git build-essential
debootstrap --variant=minbase bionic /takeover/ http://archive.ubuntu.com/ubuntu/  # Any OS would do, it's just a temporary one from which we'll install the real one.
```

We could already chroot in it, but we'll prepare the ground for
[takeover.sh](https://github.com/marcan/takeover.sh):

```bash
wget -O /takeover/busybox https://www.busybox.net/downloads/binaries/1.26.2-defconfig-multiarch/busybox-x86_64
chmod a+x /takeover/busybox
git clone https://github.com/marcan/takeover.sh /tmp/takeover.sh/
cp -a /tmp/takeover.sh/* /takeover/
cd /takeover
gcc -static fakeinit.c -o fakeinit
chroot /takeover /usr/bin/apt install openssh-server
mkdir /takeover/run/sshd
cp usr/bin/passwd bin/  # takover.sh need it here
```


OK everything is ready to "pivot" root filesystem:

```bash
sh takeover.sh  # Here Come The Dragons.
```

If everything goes well, we can now ssh to the in-memory sshd (on port
80), and kill all remaining things of the real underlying OS, umount
everything, format it, and start fresh:

```bash
ssh -p80 root@your_host
pkill -9 -f systemd
# and all remaining process using kill -9 PID PID PID PID PID PID ... EXCEPT the SSH you're actually using!
mount | tac | grep old_root | cut -d' ' -f3 | xargs umount  # Umount old_root (may need to be ran multiple times)
mkfs.ext4 /dev/xvda1  # A clean filesystem for the new distrib
mount /dev/xvda1 /old_root/
echo nameserver 9.9.9.9 > /etc/resolv.conf  # NEIN! NEIN!! NEIN!!! NEIN!!!!
apt install debootstrap
```

OK we destroyed everything from the old distrib, let's choose a new one:

```bash
debootstrap bionic /old_root/ http://archive.ubuntu.com/ubuntu/  # This is the OS and version you want to install, maybe it's not Ubuntu bionic!
mount -o bind /dev/ /old_root/dev/  # Prepare to chroot
mount -o bind /run/ /old_root/run/  # Prepare to chroot.
mount -o bind /sys/ /old_root/sys/  # Prepare to chroot..
mount -t proc none /old_root/proc/  # Prepare to chroot...
chroot /old_root/  # And we're back on disk!
```

Now we're back on disk, on the new distrib, we may have some
configuration to do before rebooting like installing a kernel,
changing root password, adding ssh keys, configuring grub, configuring
network interfaces...

```bash
echo nameserver 9.9.9.9 > /etc/resolv.conf  # Yes, again: we're not on the same root...
apt update
apt install linux-virtual openssh-server ifupdown
mkdir /root/.ssh/
wget https://mdk.fr/id_rsa.pub -O /root/.ssh/authorized_keys  # Or your own keys, your choice.
passwd  # Set a root password, useful to connect via the emergency console.
printf "%s\n%s\n" 'auto eth0' 'iface eth0 inet dhcp' > /etc/network/interfaces  # Setup the network
# Setup /etc/fstab, if you want the UUID of the disk use `blkid`.
sync  # For good measure
reboot now
```

Now you can ssh on port 22 again, yes the fingerprint will have
changed as we replaced the root filesystem we replaced /etc/ssh/key*,
don't worry.

[comments](https://news.ycombinator.com/item?id=29264929)
