Oracle cloud: convirtiendo ubuntu 20.04 en gentoo

Oracle Cloud ofrece algunos recursos de forma gratuita. En particular, puede obtener 2 máquinas virtuales de forma gratuita. Al crear una máquina, tiene la opción de centos, Ubuntu u oracle linux. Dados los recursos limitados de la máquina vitrual, me preguntaba si gentoo podría usarse en esta máquina.



La documentación de gentoo describe cómo puede convertir cualquier Linux en gentoo sobre la marcha. Desafortunadamente, la instrucción se actualizó por última vez en 2014 y si la aplica directamente, lo más probable es que tenga problemas. Sin embargo, en github puedes encontrar un script que, según el autor, puede convertir automáticamente cualquier Linux en gentoo. La secuencia de comandos no se ha actualizado durante mucho tiempo, pero después de pequeños cambios funcionó como debería. El autor del guión original decidió no aplicar mi solicitud de extracción, pero modificó su guión según mis sugerencias. Mi versión del script se puede encontrar aquí .



Así que sigamos adelante y convierta ubuntu 20.04 en gentoo. Para hacer esto, cree una máquina virtual usando la imagen mínima de ubuntu 20.04 e inicie sesión como usuario de ubuntu. Después de eso, cambie al usuario root:



sudo -i
      
      





Cambiar al modo de usuario único:



systemctl rescue
      
      





En condiciones normales, la red se cae. Esto no sucede en Oracle Cloud, pero el proceso resuelto por systemd finaliza y, como resultado, dns deja de funcionar. Arreglemoslo:



rm /etc/resolv.conf && echo 'nameserver 8.8.8.8' >/etc/resolv.conf
      
      





Ahora puede ejecutar el script de migración e ir a tomar el té, le llevará un tiempo:



wget -qO- https://raw.githubusercontent.com/kt97679/to-gentoo/master/to-gentoo|bash
      
      





Cuando finalice el script, le pedirá que reinicie. Antes de hacer esto, debe asegurarse de no perder el acceso de root después de reiniciar. Para hacer esto, debe permitir el acceso de root a través de ssh:



sed -i -e '/^PermitRootLogin.*/d' /etc/ssh/sshd_config && echo -e "\nPermitRootLogin without-password" >>/etc/ssh/sshd_config
      
      





Y arregle el archivo /root/.ssh/authorized_keys:



sed -i -e 's/.*\(ssh-rsa.*\)/\1/' /root/.ssh/authorized_keys
      
      





Ahora puede reiniciar, pero el comando de reinicio no ayudará, así que traigamos algo de artillería pesada:



sync && echo 1 > /proc/sys/kernel/sysrq && echo b > /proc/sysrq-trigger
      
      





La máquina se reinicia y después de un par de minutos podrá iniciar sesión a través de ssh como root. Estás en un entorno gentoo, pero todavía estás usando el antiguo kernel y initrd. Arreglemos esto.



Habilitemos el intercambio, sin él no tendrá suficiente memoria para compilar un nuevo kernel.



fallocate -l2G /var/tmp/swap && chmod 0600 /var/tmp/swap && mkswap /var/tmp/swap && swapon /var/tmp/swap
      
      





No planeo usar systemd en esta máquina, así que lo enmascare y udev:



echo -e 'sys-apps/systemd\nsys-fs/udev'> /etc/portage/package.mask/systemd
      
      





Después de eso, puede instalar los paquetes necesarios para compilar el kernel:



emerge gentoo-sources app-arch/lz4
      
      





Ahora puede ir al directorio con las fuentes del kernel,



cd /usr/src/linux
      
      





generar una nueva configuración de kernel usando la configuración de kernel cargada,



yes ""|make oldconfig
      
      





y deje en la configuración solo los módulos que se utilizan actualmente.



yes ""|make localmodconfig
      
      





Planeo no usar initrd en esta máquina, por lo que todos los módulos se compilarán en el kernel:



yes ""|make localyesconfig
      
      





Comenzamos a compilar e instalar el kernel:



make && make INSTALL_MOD_STRIP=1 modules_install && make install
      
      





Nuestra máquina es muy débil, por lo que este proceso llevará mucho tiempo. Cuando finaliza la compilación, debe actualizar la configuración del cargador de arranque. Agregué las opciones del kernel que se usaron en el ubuntu original.



cat >/boot/grub/grub.cfg <<EOF
set timeout=1
menuentry 'gentoo' {
  linux $(ls -t /boot/vmlinuz-*|head -n1) root=/dev/sda1 console=tty1 console=ttyS0 nvme.shutdown_timeout=10 libiscsi.debug_libiscsi_eh=1
}
EOF
      
      





Tiene sentido permitir el inicio de sesión en la consola serie si hay problemas de red:



sed -i -e 's/^#\(.*ttyS0.*\)/\1/' /etc/inittab
      
      





Dejó un poco. Después de reiniciar, la interfaz de red no se llamará ens3, sino eth0. Es necesario eliminar el script de inicialización de la interfaz anterior y agregar la inicialización de la nueva:



cd /etc/init.d && rm net.ens3 && ln -s net.lo net.eth0
      
      





Si necesita iniciar sesión a través de la consola serie, debe establecer una contraseña para el usuario root:



passwd
      
      





Todo está listo, puedes reiniciar.



Si después de reiniciar no puede iniciar sesión en la máquina a través de ssh, cree una conexión de consola y utilícela para depurar.



Ahora tiene una instalación básica de gentoo que se puede modificar para adaptarla a sus necesidades. Quedan artefactos en el sistema del ubuntu original. Ya no son necesarios y se pueden quitar. Los scripts con comandos de migración se pueden encontrar aquí .



All Articles