La versión gratuita del servicio Oracle Cloud se puede considerar como aceptable para pruebas, pero la variedad de sistemas operativos es inferior a la ofrecida por proveedores como Scaleway o Digital Ocean. Algunos usuarios han encontrado formas de instalar otras distribuciones, como en el caso de Debian
Para seguir este tutorial se necesita lo siguiente
- Cuenta en Oracle Cloud
- Recursos libres para crear un servidor (puede ser X86 o ARM)
- Cliente SSH
- Tener abierto un puerto TCP adicional al 22 dentro del firewall de Oracle Cloud (en mi caso usaré el puerto 8080)
Primero necesitamos crear un servidor virtual con Ubuntu 20.04 (el cual reemplazaremos por Debian más adelante). En caso de requerir uno con procesador X86 seleccionar la versión minimal de este debido a que esta es más conveniente por la reducida memoria RAM que hay disponible para este tipo de instancias desde la versión gratuita del servicio. Una vez que el servidor esté en marcha eliminamos algunos paquetes que no necesitamos
sudo apt purge --autoremove snapd
actualizamos los paquetes y reiniciamos
sudo apt update && sudo apt dist-upgrade -y && sudo apt install lsof && sudo reboot
Liberamos espacio
sudo apt purge -y $(dpkg-query -Wf '${Package}\n' | grep header) $(apt list --installed | grep -oP "^linux.*\d\d\d\d-oracle" | grep -v "$(uname -r)") linux-modules-extra-$(uname -r) lxc* lxd* vim* && sudo apt -y autoremove && sudo apt -y autoclean && sudo apt -y clean
sudo rm -rf /var/log/* /var/lib/apt/lists/*
Revisamos el uso de disco (La unidad raíz debería tener utilizados menos de 1.3GB en Ubuntu Standard y menos de 600MB en Ubuntu Minimal)
df -h
Obtenemos privilegios de superusuario
sudo su
Nos movemos al directorio raíz
cd /
Creamos el sistema de archivos temporal de la siguiente manera en Ubuntu Standard
mount -t tmpfs -o size=1700m tmpfs mnt
En Ubuntu Minimal el espacio requerido es menor
mount -t tmpfs -o size=600m tmpfs mnt
Copiamos el sistema raíz a la memoria RAM
tar --one-file-system -c . | tar -C /mnt -x
Cambiamos el sistema raíz del disco duro a la memoria RAM
mount --make-private -o remount,rw /
mount --move dev mnt/dev
mount --move proc mnt/proc
mount --move run mnt/run
mount --move sys mnt/sys
sed -i '/^[^#]/d;' mnt/etc/fstab
echo 'tmpfs / tmpfs defaults 0 0' >> mnt/etc/fstab
cd mnt
mkdir old_root
mount --make-private /
unshare -m
pivot_root . old_root
Iniciamos el servidor SSH desde el sistema de transición utilizando un segundo puerto (yo utilicé el 8080)
/usr/sbin/sshd -D -p 8080 &
Iniciamos sesión en el servidor SSH recién creado (podemos salirnos de la sesión actual o abrir otra terminal)
ssh -p 8080 ubuntu@hostname
Volvemos a elevar privilegios
sudo su
Cerramos los procesos asociados al sistema anterior
pkill agetty
pkill dbus-daemon
pkill atd
pkill iscsid
pkill rpcbind
pkill unattended-upgrades
kill 1
Desmontamos la unidad raíz
umount -l /dev/sda1
Revisamos que el disco duro no tenga particiones montadas
df -h
Descargamos una imagen de Debian para la nube y la escribimos en el disco duro. En el caso de utilizar un procesador X86 sería de esta forma
curl -L https://cloud.debian.org/cdimage/cloud/bullseye/latest/debian-11-generic-amd64.tar.xz | tar -OJxvf - disk.raw | dd of=/dev/sda bs=1M
En caso de utilizar un procesador ARM sería con otra imagen
curl -L https://cloud.debian.org/cdimage/cloud/bullseye/latest/debian-11-generic-arm64.tar.xz | tar -OJxvf - disk.raw | dd of=/dev/sda bs=1M
Una vez que termine sincronizamos la cache
sync
Cerramos la sesión SSH y reiniciamos desde la consola de Oracle Cloud (debemos marcar la casilla de reinicio forzado para que funcione). Una vez reiniciado el servidor limpiamos la lista de hosts conocidos del cliente SSH e iniciamos sesión mediante el usuario debian con la misma clave privada utilizada para iniciar sesión durante el proceso de migración
Referencias
https://gist.github.com/4abhinavjain/893ec13c651bee08088c8f4661998952