Creando un Nodo Bitcoin Utilizando un ODROID-HC2

Es muy probable que hayas oído hablar del Bitcoin, la criptomoneda anónima y segura que ha levantado ampollas en los últimos años. Uno de los principales problemas que he visto es que la gente suele confía en terceras personas para que gestionen sus transacciones. Me propuse comprar un pequeño netbook Dell con una insignificante CPU Intel Atom, 2 GB de RAM y un SSD de 240 GB para que actuase a modo de billetera principal para la criptomoneda, y más o menos mi banco. El ordenador portátil tiene una unidad totalmente encriptada, y dispongo de copias de seguridad de las claves de mi billetera, conservándolas en tres lugares diferentes. Sin embargo, cuando ejecutas una versión completa de las billeteras centrales, significa que tienes que almacenar una copia completa de la cadena de bloques (blockchain) en el dispositivo que la usa.

La cadena de bloques de Bitcoin ocupa alrededor de 200 GB, una gran cantidad de datos para almacenar. Sin olvidar, que mi netbook sólo se encendería cuando necesitara realizar una transacción, puesto que es más seguro tenerlo apagado. Obviamente, ejecutar la cadena de bloques en el portátil no era lo ideal, ya que tendría que estar siempre encendido. Además, quería que las conexiones entrantes y salientes fueran todavía más anónimas, así que opté por canalizar todo el tráfico del nodo a través de una VPN a modo de acceso privado a Internet, con un sistema de apagado de VPN, de modo que, si la VPN no funciona, no se conectaría y sobre ella, se usaría The Onion Relay (TOR) con la finalidad de hacer aún más anónimas las transacciones.

La ventaja de montar todo esto es permitir que cualquier dispositivo de mi LAN pueda realizar transacciones con la red blockchain directamente usando mi nodo para enviar y recibir mis transacciones, en lugar de confiar en otras personas. La otra ventaja es que, como estoy ejecutando una copia completa de la cadena de bloques, también estoy ayudando dando soporte a la red Bitcoin al proporcionar a otras personas una copia completa de la cadena de bloques. Esta guía no incluye el tema de la configuración de la VPN, pero si te ayudará a echar a andar TOR, así como a montar a propio nodo.

Inicialmente cogí la idea de pinode.co.uk donde puedes encontran muchos de estos proyectos, y ya lo tenía ejecutandose sobre un nodo Monero en una Raspberry Pi 3 Model B+ con una unidad flash de 128GB. En este tutorial he mezclado las ideas de pinode con el  Turorial de Thundroid, llegando a realizar algunos cambios en ciertas cuestiones. He optado por un ODROID-HC2 ya que me permite usar un disco duro SATA nativo, la variante HC2 permite discos de 3.5″, mientras que el HC1 permite discos de 2.5″. Cualquiera de las dos versiones puede valer, y si realmente lo quisieras, posiblemente podrías optar por un ODROID-XU4 o incluso una Raspberry Pi 3 Model B+ si usas una unidad flash de 512 GB o un kit para conectar unidades adicionales. En este tutorial usaremos l plataforma ODROID, pero puedes usar la plataforma que quieras. Técnicamente, si quisieras, podría usar incluso un PC dedicado, pero esto te llevaría a desperdiciar su hardware y sería mucho menos eficiente en cuanto a consumo de energía. Yo prefiero el ODROID sobre la Raspberry Pi, ya que el hardware que incorpora es más potente.

Hardware

Figure 1 - ODROID-HC2 with RTC battery, 1TB Seagate Iron Wolf HDD, and Model 3 Wifi NIC
Figura 1: ODROID-HC2 con batería RTC, disco duro Seagate Iron Wolf de 1TB y NIC Wifi modelo 3

La razón por la que recomiendo usar una unidad NAS es porque esta unidad estará encendida las 24 horas del día, los 7 días de la semana, leyendo y escribiendo datos continuamente. Las unidades NAS están específicamente optimizadas para este tipo de comportamiento y, por lo tanto, serán más fiables. Puedes usar perfectamente una unidad que no sea NAS, pero a largo plazo es mejor contar con una unidad NAS.

Figure 2 - ODROID-HC2 pictured in a clear acrylic case with the wireless NIC inserted, and 16GB flash card before it was flashed with the Ubuntu 18.04.1 OS
Figura 2: ODROID-HC2 dentro de una carcasa acrílica transparente con el NIC inalámbrica conectado, y una tarjeta flash de 16GB antes de grabarle el SO Ubuntu 18.04.1

Hardware opcional

Figure 3 - ODROID-HC2 being worked on at my desk with the UART connector kit pictured
Figura 3: ODROID-HC2 trabajando sobre mi mesa de escritorio con el kit de conexión UART

Lo primero es lo primero, tenemos que conectarlo a Internet. Si tienes pensado usar Wifi, sigue la wiki sobre nmcli para el ODROID. Si usas la conexión de la consola UART, sigue este tutorial. Tienes que grabar la imagen mínima de Ubuntu 18.04 que puedes descargar  aquí y luego usar Etcher para trasladarla a una MicroSD. Una vez hecho esto, colócala en el ODROID e inícialo y conéctate por SSH o a través de consola. Para ambos casos, las credenciales de inicio son:

username: root

password: odroid

Para los usuarios de Raspberry Pi, tendrán que buscar las credenciales de la imagen que estés utilizando.

Trabajo previo

Tendremos que ocuparnos de algunas cosas antes de convertirlo en un nodo Bitcoin. Primero, creamos un nuevo usuario con una contraseña segura con derechos de superusuario y cambiemos la contraseña de root. No olvides cambiar "USER" por lo que quieras en los comandos que aparecen a continuación:

$ root@odroid:~# passwd
$ root@odroid:~# adduser USER
$ root@odroid:~# usermod -aG sudo USER
$ root@odroid:~# adduser bitcoin
Necesitamos actualizar el sistema y cambiar la zona horaria y los datos de configuración regional, así como cambiar el nombre de host en /etc/hosts y /etc/hostname para que coincidan. Yo lo he nombrado como "btcdroid" pero tú puedes asignarle el nombre que quieras:
$ root@odroid:~# apt update
$ root@odroid:~# apt dist-upgrade -y
$ root@odroid:~# apt install htop git curl bash-completion jq
$ root@odroid:~# dpkg-reconfigure tzdata
$ root@odroid:~# dpkg-reconfigure locales
$ root@odroid:~# nano /etc/hosts
$ root@odroid:~# nano /etc/hostname

Montar el disco duro

Ahora tenemos que montar el disco duro. En mi caso, el disco duro era completamente nuevo y sin formato, así que tuve que formatearlo en primer lugar. Puedes seguir las instrucciones de Digital Ocean si te encuentras en la misma situación. En cualquier caso, una vez que tengas la unidad con un formato Linux compatible, podremos continuar.

Necesitaremos conseguir el UUID de la partición que se ha creado. Simplemente ejecutamos el comando lsblk y apareran en pantalla los nombres y UUID de todas las unidades.

$ root@odroid:~# lsblk --fs
Tras ejecutar este comando deberías ver algo como esto. Necesitamos anotar el UUID que nos da para usarlo en los siguientes pasos.

Figure 4 - After running the lsblk command
Figura 4 - Después de ejecutar el comando lsblk

Ahora necesitamos editar el fstab con nano y añadir una línea completamente nueva. Reemplaza 123456 por el UUID que hemos obtenido con el anterior comando.

$ root@odroid:~# nano /etc/fstab
$ # New Line in /etc/fstab
$ UUID=123456 /mnt/hdd ext4 noexec,defaults 0 0
¡Estupendo!, ahora que fstab ha sido modificado, necesitamos crear el punto de montaje, montarlo, verificarlo y definir el propietario.
$ root@odroid:~# mkdir /mnt/hdd
$ root@odroid:~# mount -a
$ root@odroid:~# df /mnt/hdd
Figure 5 - At this point if everything was done correctly you should see something similar to this
Figura 5 – Llegados a este punto, si todo se hacho correctamente, debería ver algo similar a esto

Ahora daremos permisos al usuario bitcoin para todo el disco duro que configuramos anteriormente.

$ root@odroid:~# chown -R bitcoin:bitcoin /mnt/hdd/

Mover swap al disco duro

Ahora deberemos mover el archivo swap al HDD, por lo que necesitamos instalar un paquete y hacer algunos cambios de configuración.

$ root@odroid:~# apt install dphys-swapfile
$ root@odroid:~# nano /etc/dphys-swapfile
$ #Add the following lines
$ CONF_SWAPFILE=/mnt/hdd/swapfile
$ CONF_SWAPSIZE=2048
$ root@odroid:~# dphys-swapfile setup
$ root@odroid:~# dphys-swapfile swapon
$ root@odroid:~# shutdown -r now

Aumentar la seguridad

Ahora se debe reconfigurar para tener un archivo swap de 2GB en el disco duro y debemos reiniciar. Llegado a este punto, vuelve a iniciar sesión como usuario normal y no como root, ya que estamos a punto de deshabilitar root a través de SSH. Sin embargo, si está utilizando el kit de conexión serie UART opcional, aún podrás iniciar sesión como root por este medio. Ahora continuaremos y eliminaremos el antiguo archivo swap

Endurecer SSH

Necesitamos bloquear el acceso remoto a SSH, y Digital Ocean cuenta con una excelente guía sobre seguridad SSH. Recomiendo encarecidamente deshabilitar los inicios de sesión por contraseña y exigir que se genere un par de claves SSH. Puede leer el tutorial aquí, aunque definitivamente también tendremos que deshabilitar el acceso de root. Es un riesgo de seguridad importante si se mantiene root, puesto que todo el mundo sabe que Linux tiene un usuario root. Escribe el siguiente comando para editar el archivo sshd_config.

$ user@btcdroid:~$ sudo nano /etc/ssh/sshd_config

$ #Find the following line
$ PermitRootLogin yes
$ #Change it to no so it looks like below
$ PermitRootLogin no
$ #Save and quit

$ user@btcdroid:~$ sudo service sshd restart
Eso deshabilitará el inicio de sesión de root, aunque recomiendo encarecidamente que solo se permitan inicios de sesión con par de claves SSH, ya que es mucho más seguro que una contraseña.

Firewall

Una de mis herramientas favoritas sobre la que he escrito con anterioridad es uncomplicated firewall. Sólo vamos a permitir agujeros para que el firewall permita la corrspondiente comunicación, así como limitar las conexiones SSH, de esta forma es menos probable que se vea comprometido por un ataque de fuerza bruta. También añadiremos algunas defensas para evitar un posible ataque de fuerza bruta.

La línea ufw permite 192.168.0.0/24, suponemos que la dirección IP de tu btcdroid es algo así como 192.168.0.xxx, donde xxx es cualquier número de 0 a 255. Si tu dirección IP es 12.34.56.78, debes adaptar esta línea para que ufw permita 12.34.56.0/24. De lo contrario, te bloquearías a ti mismo para siempre a menos que conectes el kit de conexión UART.

$ user@btcdroid:~$ sudo apt install ufw
$ user@btcdroid:~$ sudo ufw default deny incoming
$ user@btcdroid:~$ sudo ufw default allow outgoing

$ # make sure to use the correct subnet mask and IP ranges. (see warning above)
$ user@btcdroid:~$ sudo ufw allow from 192.168.0.0/24 to any port 22 comment 'allow SSH from local LAN'
$ user@btcdroid:~$ sudo ufw allow 9735 comment 'allow Lightning'
$ user@btcdroid:~$ sudo ufw allow 8333 comment 'allow Bitcoin mainnet'
$ user@btcdroid:~$ sudo ufw allow 18333 comment 'allow Bitcoin testnet'
$ user@btcdroid:~$ sudo ufw enable
$ user@btcdroid:~$ sudo systemctl enable ufw
$ user@btcdroid:~$ sudo ufw status
Ahora deberíamos instalar Fail2Ban, de lo que suelo hablar a menudo. Esto hace que, después de cinco intentos de inicio de sesión fallidos por SSH, bloquee la IP del atacante durante diez minutos, lo que hace que sea casi imposible realizar un ataque de fuerza bruta.
user@btcdroid:~$ sudo apt install fail2ban

Aumentar el límite de archivo abierto

En el caso de que tu BTCDroid esté saturado de solicitudes de Internet (honestas o malintencionadas debido a un ataque DDoS), rápidamente te encontrarás con el error "can't accept connection: too many open files". Esto se debe a un límite en los archivos abiertos que representan conexiones tcp individuales y que está fijado demasiado bajo.

Edita los siguientes archivos, añade las líneas adicionales justo antes del comentario final, guarda y salte.

$ user@btcdroid:~$ sudo nano /etc/security/limits.conf
$ #add/change the following lines
$ * soft nofile 128000
$ * hard nofile 128000
$ root soft nofile 128000
$ root hard nofile 128000

$ user@btcdroid:~$ sudo nano /etc/pam.d/common-session
$ #add the following
$ session required pam_limits.so

$ user@btcdroid:~$ sudo nano /etc/pam.d/common-session-noninteractive
$ #add the following
$ session required pam_limits.so

Instalación de Bitcoin Core

Finalmente estamos listos para empezar con los componentes más divertidos. Estos componentes proceden en su mayoría de pinode.co.uk, aunque parecen funcionar perfectamente en el ODROID-HC2, aunque con algunos ajustes que ya hemos realizado específicamente para la plataforma ODROID.

Primero necesitamos instalar nuestras dependencias:

$ user@btcdroid:~$ sudo apt install autoconf libevent-dev libtool libssl-dev libboost-all-dev libminiupnpc-dev -y
Luego necesitamos crear un directorio para descargar nuestros archivos y, finalmente, descargar éstos usando git:
$ user@btcdroid:~$ mkdir ~/bin
$ user@btcdroid:~$ cd ~/bin
$ user@btcdroid:~$ git clone -b 0.17 https://github.com/bitcoin/bitcoin.git
Ahora, una vez descargados, configuraremos, compilaremos e instalaremos los archivos. En los siguientes comandos ejecutaremos seis tareas al mismo tiempo, ya que ODROID cuenta con ocho núcleos que hacen que se pueda ejecutar todo más rápido. Es posible que quieras reducir este número a dos con una Raspberry Pi. También puedes ejecutarlos sin el parametro “-jX” para que se ejecute como una única tarea, aunque esto puede llevarte un par de horas. Una vez que ejecutes el comando make, vate a hacer la cena o algo porque esto tardará una o dos horas, incluso con la CPU Samsung Exynos 5422 de ocho núcleos del ODROID-XU4.
$ user@btcdroid:~$ cd bitcoin
$ user@btcdroid:~$ ./autogen.sh
$ user@btcdroid:~$ ./configure --enable-upnp-default --disable-wallet
$ user@btcdroid:~$ make -j6
$ user@btcdroid:~$ sudo make install
Ahora tenemos que preparar el directorio Bitcoin. Vamos a cambiar a bitcoin nombrado como no super-usuario, el cual creamos anteriormente, aunque puedes asignarle el nombre que quieras. Lo más importante es que este usuario solo tenga permisos para administrar el nodo bitcoin, pero no para realizar cambios en el sistema. Esto es lo mejor que tiene Linux en comparación con Windows, en cuanto a seguridad y permisos. En teoría, esto debería aislarte de un posible ataque, por lo que, en el peor de los casos, solo podrian meterse con los sistemas Bitcoin y no con el sistema operativo en sí.

Utilizamos el demonio de Bitcoin, llamado "bitcoind", que se ejecuta en segundo plano sin interfaz de usuario y almacena todos los datos en el directorio /home/bitcoin/.bitcoin. En lugar de crear un directorio real, creamos un enlace que apunte a un directorio del disco duro externo.

$ user@btcdroid:~$ sudo su bitcoin

# add symbolic link that points to the external hard drive
$ bitcoin@btcdroid:~$ mkdir /mnt/hdd/bitcoin
$ bitcoin@btcdroid:~$ ln -s /mnt/hdd/bitcoin /home/bitcoin/.bitcoin

# Navigate to home directory and check the symbolic link (the target must not be red).
$ bitcoin@btcdroid:~$ cd ~
$ bitcoin@btcdroid:~$ ls -la
Ahora debemos configurar el demonio de Bitcoin y asegurarnos de fijar una contraseña y un nombre de usuario extremadamente seguros, distintos del nombre de usuario y de la contraseña de tu sistema. A continuación, cerraremos la sesión del usuario bitcoin para configurar TOR.
$ bitcoin@btcdroid:~$ nano /home/bitcoin/.bitcoin/bitcoin.conf

# BTCDroid: bitcoind configuration
# /home/bitcoin/.bitcoin/bitcoin.conf

# Bitcoind options
$ server=1
$ daemon=1
$ txindex=1
$ disablewallet=1

# Connection settings
$ rpcuser=SECURE_USERNAME
$ rpcpassword=SECURE_PASSWORD

# Optimizations for ODROID Hardware
$ dbcache=192
$ maxorphantx=60
$ maxmempool=192
$ maxconnections=80
$ maxuploadtarget=5000

#Optimizations for Raspberry Pi 3B.
#I commented out the ones for the ones I recommend for a Raspberry Pi 3B, just uncomment those, and comment out the ODROID ones for it to work
#dbcache=96
#maxorphantx=30
#maxmempool=96
#maxconnections=40
#maxuploadtarget=5000

$ bitcoin@btcdroid:~$ exit

Configurar TOR

Ahora, instalaremos TOR para empaquetar el tráfico y cifrarlo con el fin de hacerlo todo anónimo. Vamos a instalar Tor y agregaremos un repositorio para conseguir la versión más actualizada de Tor, ya que la que está en los repositorios predeterminados es muy antigua.

Primero, agregaremos un par de entradas a /etc/apt/sources.list.d/, añadiremos la clave GPG para aceptarla, actualizaremos nuestro repositorio y finalmente instalaremos Tor.

$ user@btcdroid:~$ sudo nano /etc/apt/sources.list.d/tor.list
#Add the following lines and then save and close
deb https://deb.torproject.org/torproject.org bionic main
deb-src https://deb.torproject.org/torproject.org bionic main
#save and exit
$ user@btcdroid:~$ curl https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --import
$ user@btcdroid:~$ gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | sudo apt-key add -
$ user@btcdroid:~$ sudo apt update
$ user@btcdroid:~$ sudo apt install tor deb.torproject.org-keyring tor-arm nyx
Ahora necesitamos configurar TOR:
$ user@btcdroid:~$ sudo nano /etc/tor/torrc
#add these settings to the bottom of the file
$ ControlPort 9051
$ CookieAuthentication 1
$ CookieAuthFileGroupReadable 1
$ HiddenServiceDir /var/lib/tor/bitcoin-service/
$ HiddenServicePort 8333 127.0.0.1:8333
#save and exit
$ user@btcdroid:~$ sudo systemctl restart tor.service
#Get your Tor hostname
$ user@btcdroid:~$ sudo cat /var/lib/tor/bitcoin-service/hostname
Vamos a necesitar el nombre de host que muestre (con una dirección ".onion"), así que ten en cuenta el resultado del último comando.

Configurarlo todo para el inicio automático

Queremos programarlo todo para que se inicie en el arranque, de modo que crearemos un servicio SystemD que iniciará nuestro nodo Bitcoin para que se ejecute con el usuario bitcoin y se pase a TOR. En este punto, te doy la opción de ejecutarlo solo en TOR o permitir que se ejecute sobre TOR, IPv4 e IPv6. La opción de solo Tor es más anónima, el otro modo es más bien un modo dual, por lo tanto, si TOR no está disponible, aún se puede sincronizar y además la sincronización es más rápida. La elección es suya: simplemente elimina el comentario para el que quieras donde dice ExecStart e inserta tu hostname.onion donde te lo solicite en el comando ExecStart. Después de esto, reiniciaremos y veremos si todo funciona. Asegúrate de usar el nombre de usuario que creamos anteriormente donde dice USER_NAME.

$ user@btcdroid:~$ sudo nano /etc/systemd/system/bitcoind.service

# BTCdroid systemd unit for bitcoind
# /etc/systemd/system/bitcoind.service

$ [Unit]
$ Description=Bitcoin daemon
$ After=network.target

$ [Service]
#Uncomment the ExecStart string below to force the node to only run over Tor
#ExecStart= /usr/local/bin/bitcoind -datadir=/home/bitcoin/.bitcoin/data -daemon -proxy=127.0.0.1:9050 -externalip=HOSTNAME.onion -conf=/home/bitcoin/.bitcoin/bitcoin.conf -listen -bind=127.0.0.1 -pid=/run/bitcoind/bitcoind.pid

#Uncomment the ExecStart string below to allow Tor, IPv4, and IPv6 connections
#ExecStart= /usr/local/bin/bitcoind -datadir=/home/bitcoin/.bitcoin/data -daemon -proxy=127.0.0.1:9050 -externalip=HOSTNAME.onion -conf=/home/bitcoin/.bitcoin/bitcoin.conf -listen -discover -pid=/run/bitcoind/bitcoind.pid

#Tells Bitcoin to shutdown safely when stopped.
$ ExecStop= /usr/local/bin/bitcoin-cli stop

# Creates /run/bitcoind owned by bitcoin
$ RuntimeDirectory=bitcoind
$ User=bitcoin
$ Group=bitcoin
$ Type=forking
$ PIDFile=/run/bitcoind/bitcoind.pid
$ Restart=on-failure

# Hardening measures
####################

# Provide a private /tmp and /var/tmp.
$ PrivateTmp=true

# Mount /usr, /boot/ and /etc read-only for the process.
$ ProtectSystem=full

# Disallow the process and all of its children to gain
# new privileges through execve().
$ NoNewPrivileges=true

# Use a new /dev namespace only populated with API pseudo devices
# such as /dev/null, /dev/zero and /dev/random.
$ PrivateDevices=true

# Deny the creation of writable and executable memory mappings.
$ MemoryDenyWriteExecute=true

[Install]
$ WantedBy=multi-user.target
#save and exit
$ user@btcdroid:~$ sudo systemctl enable bitcoind.service
$ user@btcdroid:~$ sudo shutdown -r now
$ user@btcdroid:~$ mkdir /home/USER_NAME/.bitcoin
$ user@btcdroid:~$ sudo cp /home/bitcoin/.bitcoin/bitcoin.conf /home/USER_NAME/.bitcoin/
$ user@btcdroid:~$ sudo chown USER_NAME:USER_NAME /home/USER_NAME/.bitcoin/bitcoin.conf
Debe reiniciarse, así que espere un minuto y vuelva a conectarse con el usuario que creamos al principio. Puede tardar algunos minutos hasta que el nodo reciba sus primeras conexiones, y luego comenzará a tirar de los bloques. Puede verificar el estado con el comando bitcoin-cli.
$ user@btcdroid:~$ bitcoin-cli getblockchaininfo
Debería mostrar algo como esto (Figura 6) y si la cantidad de bloques aumente cada pocos minutos, todo funciona bien. Ten en cuenta que esto podría demorarse varios días, ya que necesitamos descargar al menos 200 GB para estar al día con el blockchain.

Figure 6 - Output of bitcoin-cli
Figura 6 – Resultado de bitcoin-cli

Resultado de Bitcoin-cli

Además de verificar el estado de la descarga del blockchain, puedes monitorizar el tráfico a través de TOR con Nyx.

$ user@btcdroid:~$ sudo nyx
Figure 7 - Seeing the traffic via Tor on Nyx
Figura 7 - Viendo el tráfico a través de Tor con Nyx

Actualización automática de parches de seguridad

Puesto que se trata de un dispositivo que, mayoritariamente, vamos a dejar encendido y desatendido, es mejor configurarlo para que automaticamente se aplique cualquier parche de seguridad que pueda estar disponible y de esta forma se mantega por si solo. Así que activemos el paquete de actualizaciones desatendidas y lo configuraremos. El primer paso muestra en pantalla un prompt interactivo y a continuación procedemos a editar los archivos.

$ user@btcdroid:~$ sudo dpkg-reconfigure --priority=low unattended-upgrades
$ user@btcdroid:~$ sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
#modify these lines in the file to look like the following, although you can make it reboot whenever you want. Make sure there is a semicolon at the end of each line. You can uncomment the "${distro_id}:${distro_codename}-updates"; line if you want it to update non security related packages too

#near the top of the file
$ Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}";
"${distro_id}:${distro_codename}-security";
// Extended Security Maintenance; doesn't necessarily exist for
// every release and this system may not have it installed, but if
// available, the policy for updates is such that unattended-upgrades
// should also install from here by default.
"${distro_id}ESM:${distro_codename}";
// "${distro_id}:${distro_codename}-updates";
// "${distro_id}:${distro_codename}-proposed";
// "${distro_id}:${distro_codename}-backports";
};

#below are spread out in the same file
$ Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
$ Unattended-Upgrade::Remove-Unused-Dependencies "true";
$ Unattended-Upgrade::Automatic-Reboot "true";
$ Unattended-Upgrade::Automatic-Reboot-Time "02:30";
#save and exit
Eso es todo, has terminado. Déjame conocer qué es lo que piensas o si crees que habría que mejorar algo. Con el tiempo, lo ubicaré en un servidor Supermicro dentro de mi rack con una matriz ZFS, posiblemente el próximo año.

Be the first to comment

Leave a Reply