# Home

👨🏻‍💻 **Shares**

* [Breezy-weather, Translation](https://hosted.weblate.org/changes/?user=AzagraMac\&action=2\&action=5) - [Android App](https://github.com/breezy-weather/breezy-weather/releases)
* [Duinocoin, Telegram Bot](https://duinocoin.com/apps.html) - [Telegram bot](https://github.com/azagramac/DuinoCoinTelegramBot)
* [Wireguard docker](https://github.com/azagramac/wireguard-docker)
* [Adguardhome docker](https://github.com/azagramac/adguardhome-docker)
* [WireGuard for Ubiquiti EdgeRouter 4](https://blog.azagra.dev/unifi/configurar-wireguard-en-edgerouter-4-6p)

🗒 **Tech stuff:**

* ![Linux](https://img.shields.io/badge/OS-Linux-informational?style=flat\&logo=linux\&logoColor=white\&color=2bbc8a) ![Debian](https://img.shields.io/badge/OS-Debian-informational?style=flat\&logo=debian\&logoColor=white\&color=d70a53) ![Fedora](https://img.shields.io/badge/OS-Fedora-informational?style=flat\&logo=fedora\&logoColor=white\&color=0B57A4) ![RedHat](https://img.shields.io/badge/OS-RedHat-informational?style=flat\&logo=redhat\&logoColor=white\&color=CC0000) ![Ubuntu](https://img.shields.io/badge/OS-Ubuntu-informational?style=flat\&logo=ubuntu\&logoColor=white\&color=dd4814) ![Linux Mint](https://img.shields.io/badge/OS-LinuxMint-informational?style=flat\&logo=linuxmint\&logoColor=white\&color=3EB489) ![Macintosh](https://img.shields.io/badge/OS-MacOS-informational?style=flat\&logo=apple\&logoColor=white\&color=aaaaaa)
* ![Docker](https://img.shields.io/badge/Docker-informational?style=flat\&logo=docker\&logoColor=white\&color=0db7ed) ![Amazon AWS](https://img.shields.io/badge/Amazon%20AWS-informational?style=flat\&logo=icloud\&logoColor=white\&color=ff9900) ![Kubernetes](https://img.shields.io/badge/Kubernetes-informational?style=flat\&logo=kubernetes\&logoColor=white\&color=3970e4) ![Openshift](https://img.shields.io/badge/Openshift-informational?style=flat\&logo=redhatopenshift\&logoColor=white\&color=EE0000) ![GitHub](https://img.shields.io/badge/GitHub-informational?style=flat\&logo=github\&logoColor=white\&color=171515) ![GitLab](https://img.shields.io/badge/GitLab-informational?style=flat\&logo=gitlab\&logoColor=white\&color=fca326) ![Snyk](https://img.shields.io/badge/Snyk-informational?style=flat\&logo=snyk\&logoColor=white\&color=000000) ![Ansible](https://img.shields.io/badge/Ansible-informational?style=flat\&logo=ansible\&logoColor=white\&color=000000) ![Jfrog](https://img.shields.io/badge/Jfrog-informational?style=flat\&logo=jfrog\&logoColor=white\&color=40be46) ![SonarQube](https://img.shields.io/badge/SonarQube-informational?style=flat\&logo=sonarqube\&logoColor=white\&color=42c2f5) ![Jenkins](https://img.shields.io/badge/Jenkins-informational?style=flat\&logo=jenkins\&logoColor=white\&color=48728B) ![ArgoCD](https://img.shields.io/badge/ArgoCD-informational?style=flat\&logo=argo\&logoColor=white\&color=000080) ![Arduino](https://img.shields.io/badge/Arduino-informational?style=flat\&logo=arduino\&logoColor=white\&color=008184) ![Android](https://img.shields.io/badge/Android%20SDK-informational?style=flat\&logo=android\&logoColor=white\&color=34a853)

***

👥 **Follow me**

[![GitHub](https://img.shields.io/badge/-github-171515?style=flat\&labelColor=171515\&logo=github\&logoColor=white)](https://github.com/AzagraMac/) [![DockerHub](https://img.shields.io/badge/-dockerhub-086dd7?style=flat\&labelColor=086dd7\&logo=docker\&logoColor=white)](https://hub.docker.com/repositories/azagramac) [![Blog](https://img.shields.io/badge/-gitbook-0088cc?style=flat\&labelColor=0088cc\&logo=gitbook\&logoColor=white)](https://blog.azagra.dev) [![Keybase](https://img.shields.io/badge/-keybase-3663ea?style=flat\&labelColor=ff6f21\&logo=keybase\&logoColor=white)](https://keybase.io/joselazagra)

<div align="center"><img src="https://komarev.com/ghpvc/?username=azagramac&#x26;label=Hello&#x26;color=0e75b6&#x26;style=flat" alt=""> <img src="https://media.tenor.com/dHk-LfzHrtwAAAAi/linux-computer.gif" alt="" width="35"></div>


# Android


# Habilitar VoLTE y VoWiFi OnePlus 8T

<figure><img src="/files/fbm064ic0plAzZrXsug9" alt="" width="375"><figcaption></figcaption></figure>

Testeado en ROM Stock: OxygenOS 14 ([14.0.0.1311 EX01](https://community.oneplus.com/thread/1967661946815643650))\
Operador: Movistar / O2\
Aplicaciones:\
Shizuku: [v13.6.0](https://github.com/RikkaApps/Shizuku/releases/tag/v13.6.0)\
Pixel IMS: [v1.3.2](https://github.com/kyujin-cho/pixel-volte-patch/releases/tag/1.3.2)

<figure><img src="/files/Df5IX5qv8CyXTyL7LXLR" alt=""><figcaption></figcaption></figure>

Antes de nada, consulta con tu operador si tienes habilitado VoLTE y VoWiFi, si no es así, te lo tienen que habilitar, luego ya podrás realizar el tutorial.

En ***Opciones de Desarrollador*** hay que activar ***Depuración inalámbrica*** y también activar ***Desactivar supervisión de permisos*** que está casi abajo del todo, si no Shizuku dará problemas.

<div><figure><img src="/files/40pFPPhU7GlqHE1A2SYp" alt=""><figcaption></figcaption></figure> <figure><img src="/files/WPAuruIhs88c0GEjQ7v6" alt=""><figcaption></figcaption></figure> <figure><img src="/files/EVrkeDqTwD0stTWaC9rP" alt=""><figcaption></figcaption></figure></div>

<br>

1. Cuando activamos la depuración inalámbrica nos pide dar a permitir en la red wifi que estemos conectados en ese momento. Le damos permitir.
2. Abrimos la aplicación Shizuku, Entramos en la ***Depuración inalámbrica*** y damos ***Emparejar dispositivo*** ***con código de sincronización***. Nos aparece un código de 6 cifras.

<div><figure><img src="/files/UiIGCy2Yew5RGr223G6l" alt=""><figcaption></figcaption></figure> <figure><img src="/files/IgUmhpKENLPoqHdymVFF" alt=""><figcaption></figcaption></figure> <figure><img src="/files/r7lQayUSi9wbp6dCGrna" alt=""><figcaption></figcaption></figure></div>

En Shizuku detectara ese código o lo metemos a mano.

Volvemos a la App de Shizuku y le damos a ***Iniciar***, aparecerá una terminal que se quitara sola pasado unos segundos.

<figure><img src="/files/ui4I5gjjz0bc2fRSaU66" alt="" width="314"><figcaption></figcaption></figure>

Ya tenemos Shizuku corriendo, ahora abrimos la aplicación Pixel IMS, nos preguntara, le damos ***Permitir siempre***.

Luego en las pestañas en la parte inferior, seleccionamos la SIM que queremos habilitar ***VoLTE*** y ***VoWiFi***, habilitamos y sin tocar nada mas, reiniciamos el OnePlus 8T.

<div><figure><img src="/files/F3L5i33EwvttUCS216Xh" alt=""><figcaption></figcaption></figure> <figure><img src="/files/fobywp6J1Wt0t87EAMlI" alt=""><figcaption></figcaption></figure></div>

Después de reiniciar, entramos en ***Ajustes / Red móvil /*** seleccionamos la SIM, y habilitamos ***Llamadas Wi-Fi*** y ***Llamadas 4G*** (este seguramente aparezca habilitado)

<figure><img src="/files/DB2pPQQc604aWdixJJE0" alt="" width="314"><figcaption></figcaption></figure>


# LineageOS, PlayIntegrityFix y playcurlNEXT

<figure><img src="/files/zF2LJdsCKw8Lv3E76P6Y" alt="" width="375"><figcaption></figcaption></figure>

Preparativos:

* Magisk: <https://github.com/topjohnwu/Magisk/releases/tag/v28.1>
* PlayIntegrityFix: <https://github.com/chiteroman/PlayIntegrityFix/releases/tag/v18.7>
* playcurlNEXT: <https://github.com/daboynb/playcurlNEXT/releases/tag/v1.14>

{% hint style="warning" %}
Pruebas realizadas con las versiones de los paquetes indicadas.
{% endhint %}

Después de instalar LineageOS en el dispositivo (OnePlus 8T en mi caso) siguiendo la [guía](https://wiki.lineageos.org/devices/kebab/install/#unlocking-the-bootloader) oficial, sin reiniciar después de instalar la rom, instalamos las [Google Apps](https://github.com/MindTheGapps/15.0.0-arm64/releases/tag/MindTheGapps-15.0.0-arm64-20250214_082511) (opcional) y el modulo [Magisk](https://github.com/topjohnwu/Magisk/releases) (renombramos el fichero .apk a .zip) y lo instalamos normalmente como la rom y las gapps.

```shell
adb -d sideload filename.zip
```

<figure><img src="/files/YQaTdlE6lZTdovthqUEA" alt="" width="563"><figcaption></figcaption></figure>

Nada mas abrir la primera vez Magisk nos pedirá actualizar y reiniciar.

Después de reiniciar habilitamos Zygisk, en la App de Magisk, entramos en Ajustes y marcamos Zygisk y reiniciamos de nuevo.

<figure><img src="/files/SJ7YuaU8upqL8NKEBKVD" alt="" width="375"><figcaption></figcaption></figure>

Ahora podemos marcar también la lista de denegación y seleccionar las apps, recomendable apps de banca, wallet, cla\@vePin, Waylet, chatgpt si lo tenemos... y sobre todo los servicios de google.

* `com.google.android.gms`
* `com.google.android.unstable`
* `com.google.android.gms:snet`

Y así tendríamos que tenerlo.

<figure><img src="/files/k8LBJNv77PqaOOSFCMO2" alt="" width="375"><figcaption></figcaption></figure>

Para instalar los módulos, descargamos los ficheros .zip mencionados anteriormente, y le damos a "Instalar desde almacenamiento" en la pestaña de Módulos dentro de Magisk, seleccionamos el fichero y posteriormente reiniciamos el dispositivo.

Los módulos instalados, (*Shamiko y Systemless Hosts aparecen deshabilitados, ya que no funcionan o al menos no me han funcionado en LinegeOS 22.1*)

<figure><img src="/files/p2Oglpp2eUxpNZ8ooFel" alt="" width="375"><figcaption></figcaption></figure>

Y podemos verificar que todo esta ok con la App "[SafetyNet | Integrity Checker](https://play.google.com/store/apps/details?id=com.flinkapps.safteynet)" y/o "[Play Integrity API Checker](https://play.google.com/store/apps/details?id=gr.nikolasspyr.integritycheck)"

<figure><img src="/files/o8d1lzQcBOdg0d4CzWm8" alt="" width="563"><figcaption></figcaption></figure>

{% hint style="danger" %}
Si te marcara error en MEETS\_STRONG\_INTEGRITY esta reportado en <https://github.com/chiteroman/PlayIntegrityFix/issues/579>
{% endhint %}


# Instalar Termux

<img src="/files/gy3WlDiK5kZ2ABccAvIP" alt="" data-size="line">Tenemos varias posibilidades de instalar Termux en nuestro Android, pero la mas completa es directamente desde <img src="/files/Nkj7gVal5LOjNffY9u2i" alt="" data-size="line">F-Droid (<https://f-droid.org/en/packages/com.termux/>)\
\
Abrimos la App F-Droid si la tenemos instalada

![](/files/myoIHrK4L03g5nyL6uum)

Pinchamos donde la lupa, abajo a la derecha y buscamos Termux

![](/files/o1NymVO3K2sKPyoqMcho)

Después de instalarse, instalaremos unos paquetes

```shell
pkg update
pkg install termux-api
pkg install termux-tools
pkg install iproute2

apt update
apt install vim curl git wget neofetch bash-completion
```

Habilitar SSH

```shell
pkg install openssh
pkg install net-tools
pkg install procps
```

Comprobamos un parametro en la configuración del ssh

```shell
cat $PREFIX/etc/ssh/sshd_config
```

Deberá estar en `yes`, `PasswordAuthentication`

Comprobaremos que usuario tenemos en Termux

```shell
whoami
```

Y le asignaremos una password a nuestro user

```shell
passwd
```

Iniciaremos el demonio SSH

```shell
sshd
```

Conectarse desde un terminal a Android

```shell
ssh user@ip -p 8022
```

<figure><img src="/files/FRlU4Ym5PxJhjPzZpBTL" alt=""><figcaption></figcaption></figure>


# Optimizar paquetes después de instalar ROM

Después de instalar una ROM la bateria esta algo perdida y necesitamos unos dias para que se "asiente" y las lecturas sean más correcta, aunque podremos hacer algún calibrado de bateria despues de una carga completa con alguna App como "[Battery Calibrator](https://f-droid.org/packages/eu.roggstar.luigithehunter.batterycalibrate/)", necesitamos optimizar los paquetes instalados.\
\ <img src="/files/FvUXZ1VLZcn7uRPAoVR5" alt="" data-size="line">Informacion <https://developer.android.com/training/wearables/compose/performance?hl=es-419>\
\
Necesitaremos:\
\- Custom ROM\
\- root\
\- [Termux](/android/instalar-termux)

Abrimos Termux y ejecutamos este comando

```
su -c "cmd package bg-dexopt-job"
```

En función del móvil y los paquetes instalados que tengamos, tardará más o menos en responder, cuando finalice nos devolver un "`Success`"

![](/files/CwGoFHsNwOPBnEG9b6jd)

Despues, usar normalmente.\
Ejecutar este comando despues de instalar todos los paquetes y Apps.


# Arduino


# Error LIBUSB\_ERROR\_ACCESS

En entornos Linux modernos, es habitual en placas USB como Arduino cuando no existen reglas udev adecuadas ver el error LIBUSB\_ERROR\_ACCESS

`LIBUSB_ERROR_ACCESS` es un error de libusb que indica que el proceso no tiene permisos suficientes para acceder al dispositivo USB a bajo nivel. Suele aparecer cuando una aplicación (Arduino IDE, dfu-util, OpenOCD, etc.) intenta abrir un dispositivo USB sin privilegios adecuados o cuando otro servicio del sistema ya lo está ocupando (frecuentemente ModemManager en dispositivos CDC/ACM).

#### Solución

📦 Instalamos los siguientes paquetes

```bash
sudo apt install -y libusb-1.0-0 dfu-util dfu-programmer
```

📝 Creamos el fichero `/etc/udev/rules.d/60-arduino.rules` con el siguiente contenido:

```bash
# ------------------------------------------------------------
# Arduino GIGA R1 WiFi (CDC ACM)
# ------------------------------------------------------------
SUBSYSTEM=="tty", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0266", \
  MODE="0666", GROUP="dialout", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1", \
  ENV{ID_MM_CANDIDATE}="0"

SUBSYSTEM=="usb", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0366", \
  MODE="0666", GROUP="dialout", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1", \
  ENV{ID_MM_CANDIDATE}="0"

# ------------------------------------------------------------
# STM32 DFU (GIGA / STM32H7)
# ------------------------------------------------------------
SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", \
  MODE="0666", TAG+="uaccess", ENV{ID_MM_DEVICE_IGNORE}="1"

# ------------------------------------------------------------
# Arduino UNO
# ------------------------------------------------------------
SUBSYSTEM=="tty", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0043", \
  MODE="0666", GROUP="dialout", TAG+="uaccess"

# ------------------------------------------------------------
# CH340
# ------------------------------------------------------------
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", \
  MODE="0666", GROUP="dialout", TAG+="uaccess"
```

#### Reiniciar `daemon udev` y aplicar reglas

```bash
sudo udevadm control --reload-rules
sudo udevadm trigger
```

#### Verificación

```bash
udevadm info -q all -n /dev/ttyACM0 | grep MM
```

Salida esperada

```bash
$ udevadm info -q all -n /dev/ttyACM0 | grep ID_
E: ID_MM_DEVICE_IGNORE=1
E: ID_MM_CANDIDATE=1
E: ID_BUS=usb
E: ID_MODEL=Giga
E: ID_MODEL_ENC=Giga
E: ID_MODEL_ID=0266
E: ID_SERIAL=Arduino_Giga_xxxxxxxxxxxxxxxxxxxxxxxxxxxx
E: ID_SERIAL_SHORT=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
E: ID_VENDOR=Arduino
E: ID_VENDOR_ENC=Arduino
E: ID_VENDOR_ID=2341
E: ID_REVISION=0101
E: ID_TYPE=generic
E: ID_USB_MODEL=Giga
E: ID_USB_MODEL_ENC=Giga
E: ID_USB_MODEL_ID=0266
E: ID_USB_SERIAL=Arduino_Giga_xxxxxxxxxxxxxxxxxxxxxxxxxxxx
E: ID_USB_SERIAL_SHORT=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
E: ID_USB_VENDOR=Arduino
E: ID_USB_VENDOR_ENC=Arduino
E: ID_USB_VENDOR_ID=2341
E: ID_USB_REVISION=0101
E: ID_USB_TYPE=generic
E: ID_USB_INTERFACES=:020201:0a0000:
E: ID_USB_INTERFACE_NUM=00
E: ID_USB_DRIVER=cdc_acm
E: ID_USB_CLASS_FROM_DATABASE=Miscellaneous Device
E: ID_USB_PROTOCOL_FROM_DATABASE=Interface Association
E: ID_VENDOR_FROM_DATABASE=Arduino SA
E: ID_PATH_WITH_USB_REVISION=pci-0000:08:00.1-usbv2-0:3.3:1.0
E: ID_PATH=pci-0000:08:00.1-usb-0:3.3:1.0
E: ID_PATH_TAG=pci-0000_08_00_1-usb-0_3_3_1_0
E: ID_FOR_SEAT=tty-pci-0000_08_00_1-usb-0_3_3_1_0
```


# Unboxing Arduino GIGA R1

<figure><img src="/files/B1A5yPjusHUAqvJCugvH" alt=""><figcaption></figcaption></figure>

**Specs**

| Board                     | Description                                             |
| ------------------------- | ------------------------------------------------------- |
| **Name**                  | Arduino® GIGA R1 WiFi                                   |
| SKU                       | ABX00063                                                |
| Microcontroller           | STM32H747XI dual Cortex®-M7+M4 32bit low power Arm® MCU |
| **USB**                   |                                                         |
| USB-C                     | Programming Port / HID                                  |
| USB-A                     | Host (enable with PA\_15)                               |
| **Pins**                  |                                                         |
| Digital I/O Pins          | 76                                                      |
| Analog input pins         | 12                                                      |
| DAC                       | 2 (DAC0/DAC1)                                           |
| PWM pins                  | 12                                                      |
| Misc                      | VRTC & OFF pin                                          |
| **Communication**         |                                                         |
| UART                      | Yes, 4x                                                 |
| I2C                       | Yes, 3x                                                 |
| SPI                       | Yes, 2x                                                 |
| CAN                       | Yes (requires an external transceiver).                 |
| **Connectors**            |                                                         |
| Camera                    | I2C + D54-D67                                           |
| Display                   | D1N, D0N, D1P, D0P, CKN, CKP + D68-D75                  |
| Audio Jack                | DAC0, DAC1, A7                                          |
| **Power**                 |                                                         |
| Circuit operating voltage | 3.3V                                                    |
| Input voltage (VIN)       | 6-24V                                                   |
| DC Current per I/O Pin    | 8 mA                                                    |
| **Clock speed**           |                                                         |
| Main core                 | 480 MHz                                                 |
| Second core               | 240 MHz                                                 |
| **Memory**                |                                                         |
| STM32H747XI               | 2MB Flash, 1MB RAM                                      |
| **Dimensions**            |                                                         |
| Width                     | 53.3 mm                                                 |
| Length                    | 101.5 mm                                                |

<figure><img src="/files/zO8kQrKc9jzRGDuMx807" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/RmPoojH2wymj0f2ENxGs" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/WvcryXH2Be4s2QDVL69L" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/1Z5FnlmyJ31xBvMlYIwq" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/tqyDilnsA5RjJfZtDF48" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/p6TqNsPkjVN5gazz388W" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/qbMQi78QFi5NxAOR20a5" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/o1cv41KlEXPmdkr3bKqW" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/GJx2hAxUfAg6kGa676Zd" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/5AKbEaXJaDONIbxdgjef" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/FMxkWtGJucaxOAw50kk5" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/koaVb6is7MuzgFHxpoDr" alt=""><figcaption></figcaption></figure>

{% embed url="<https://store.arduino.cc/collections/giga/products/giga-display-bundle>" %}

{% embed url="<https://mou.sr/4vrhat6>" %}


# Grabar EPROM

Material necesario:\
\- [Borrador de EPROM](https://es.aliexpress.com/item/1005006520190711.html) (EPROM Eraser)\
\- [Programador EPROM](https://es.aliexpress.com/item/1005008646900797.html) (Xgecu T48)\
\- Chips EPROM, en este ejemplo, [AM27C1024](https://es.aliexpress.com/item/1005012031312001.html)\
\- [Software Xgpro](http://www.xgecu.com/EN/download.html?refreshed=1781909489908), actualmente [v13.16](https://www.mediafire.com/folder/hfg5kfj7euw5j/xgecu)

#### 1. Borrado de EPROM

Antes de grabar una EPROM es imprescindible asegurarse de que está completamente vacía. Las EPROM con ventana de cuarzo, como la **AM27C1024**, se borran mediante exposición a luz ultravioleta (UV).

**Procedimiento**

1. Retira cualquier etiqueta que cubra la ventana de cuarzo de la EPROM y limpia la superficie.

{% hint style="info" %}
Comprueba que no hay daños físicos en el chip, la ventana o las patillas, en tal caso esa EPROM queda descartada.
{% endhint %}

2. Introduce la EPROM en el borrador UV (EPROM Eraser) con la ventana orientada hacia la lámpara.<br>

   <figure><img src="/files/p7ePa4A8enS5rPqPzVl1" alt="" width="375"><figcaption></figcaption></figure>

3. Cierra el borrador para evitar la exposición accidental a la radiación UV.<br>

   <figure><img src="/files/TfKjNBHJEP3BNyBtMh5q" alt="" width="375"><figcaption></figcaption></figure>

4. Programa un tiempo de borrado de entre **15 y 30 minutos** (consulta siempre la hoja de datos del fabricante), si son usadas, mejor 30.<br>

   <figure><img src="/files/2weVbJZRRtVAYRsBLuDV" alt="" width="375"><figcaption></figcaption></figure>

{% hint style="warning" %}
La radiación UV puede degradar gradualmente la EPROM con el paso de los años y múltiples ciclos de borrado. Por ello, se recomienda realizar únicamente el tiempo de exposición necesario y volver a cubrir la ventana con una etiqueta opaca una vez finalizada la grabación para evitar borrados accidentales por exposición prolongada a la luz solar o fuentes intensas de radiación UV.
{% endhint %}

5. Una vez finalizado el proceso, retira la EPROM del borrador.

#### 2. Verificación del borrado

Después del borrado, coloca la EPROM en el programador respetando la posición y ejecuta la función **Blank Check** desde Xgpro.

<figure><img src="/files/x98ZRs38atQjlqTokEow" alt="" width="375"><figcaption></figcaption></figure>

<figure><img src="/files/s7ZIm1i40bl2WlEKugK4" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/1d7XwuFxNLzgNg0r6zYD" alt=""><figcaption></figcaption></figure>

Una EPROM correctamente borrada debe devolver:

```bash
FF FF FF FF FF FF FF FF ...
```

en todas sus posiciones de memoria.

<figure><img src="/files/1WwMIZm1DA0ieCxNAsgt" alt=""><figcaption></figcaption></figure>

Si el **Blank Check** falla, vuelve a introducir la EPROM en el borrador UV ([Step 1](#id-1.-borrado-de-eprom)) durante unos minutos adicionales (5/10 minutos) y repite la comprobación hasta que toda la memoria esté a `0xFF`.

#### 3. Grabar la EPROM

Una vez que la EPROM ha sido borrada correctamente y ha superado el **Blank Check**, se puede proceder a la grabación del contenido deseado.

**Procedimiento**

1. Inserta la EPROM en el zócalo ZIF del programador respetando la orientación indicada por el fabricante.\
   ![](/files/UHJnJEYS2A9B7tToL2IY)
2. Inicia el software **Xgpro**.
3. Selecciona el modelo exacto de la EPROM (en este ejemplo, **AM27C1024**).<br>

   <figure><img src="/files/PPlplelTsw5kRu1R0TAU" alt=""><figcaption></figcaption></figure>
4. Carga el fichero binario (`.bin`, `.rom`, `.img`, etc.) que deseas grabar mediante la opción **File → Open**.<br>

   <figure><img src="/files/APMhboyDnTtd68IUcePN" alt=""><figcaption></figcaption></figure>
5. Verifica que el tamaño del fichero es compatible con la capacidad de la EPROM.<br>

   <figure><img src="/files/u0XeAPugMBkzRmekudzi" alt=""><figcaption></figcaption></figure>
6. Comprueba que la configuración de voltajes y parámetros de programación es la adecuada para el dispositivo seleccionado. (por defecto el programa ya lo hace automáticamente)<br>

   <figure><img src="/files/NkDUODwJ8MlejeFFkL7L" alt=""><figcaption></figcaption></figure>
7. Pulsa **PROG.** para iniciar la grabación.<br>

   <figure><img src="/files/tc4HXpgJ4K22NyoaQyTD" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Recomendaciones**

* No extraigas la EPROM del programador durante la grabación.
* Evita interrupciones de alimentación eléctrica mientras el proceso está en curso.
* Utiliza siempre el modelo exacto de EPROM en Xgpro para garantizar que se emplean los voltajes y algoritmos de programación adecuados.
  {% endhint %}

\
**Durante la grabación**

El programador escribirá el contenido en la EPROM y mostrará el progreso del proceso. Dependiendo del tamaño del dispositivo, la grabación puede tardar desde unos segundos hasta varios minutos.

<figure><img src="/files/9Jlnb3qJcXZ5EMJaahNO" alt=""><figcaption></figcaption></figure>

\
Grabación finalizada con éxito ✅

<figure><img src="/files/e67JyGIqsa4lL5LkFufQ" alt=""><figcaption></figcaption></figure>

#### 4. Verificación de la grabación

Una vez finalizado el proceso de programación, es obligatorio realizar una verificación para asegurar que los datos escritos en la EPROM coinciden exactamente con el fichero original.

**Procedimiento**

1. Mantén la EPROM correctamente insertada en el programador.
2. En **Xgpro**, selecciona la opción **Verify**.<br>

   <figure><img src="/files/yoNORNHAmP6NE4Bm9JRg" alt=""><figcaption></figcaption></figure>
3. Carga de nuevo el fichero original utilizado en la programación (*en Load, selecciona el fichero*).
4. Ejecuta el proceso de verificación.<br>

   <figure><img src="/files/E9cu2KoFa7e2CLdMJBuj" alt=""><figcaption></figcaption></figure>

El programador leerá el contenido completo de la EPROM y lo comparará byte a byte con el archivo cargado.

**Resultado esperado**

* **Verify Finished** → La grabación es correcta y los datos coinciden exactamente.
* **Verify Fail** → Existe al menos una discrepancia entre la EPROM y el archivo original.

\
**Verificación avanzada (recomendada)**

Para aumentar la seguridad del proceso, se puede realizar una verificación externa adicional:

1. Realizar un **read (dump)** completo de la EPROM desde Xgpro.
2. Guardar el contenido como un nuevo fichero.
3. Comparar el fichero leído con el original mediante hash MD5 / SHA:

\
Dump:<br>

<figure><img src="/files/1LuWWE8S290o5ex1YUia" alt=""><figcaption></figcaption></figure>

\
Fichero original:<br>

<figure><img src="/files/Go644k148KA7S9ciVK6u" alt=""><figcaption></figcaption></figure>

#### 5. Pruebas

Una vez verificada la grabación y montada la EPROM en el sistema destino, se realizan las pruebas funcionales para confirmar que el contenido programado se ejecuta correctamente en condiciones reales.

**Objetivo**

Validar que la EPROM no solo contiene datos correctos, sino que estos son interpretados adecuadamente por el sistema donde se utiliza.

**Procedimiento**

1. Instalar la EPROM en el equipo o placa destino, asegurando correcta orientación y contacto en el zócalo.
2. Encender el sistema y observar el comportamiento de arranque.
3. Comprobar las funciones principales dependientes del contenido de la EPROM (firmware, tablas de datos, BIOS, lógica de control, etc.).
4. Realizar pruebas operativas completas según el propósito del sistema (arranque en frío, reinicios, ciclos de carga, etc.).

**Validaciones típicas**

* Arranque correcto del sistema sin errores.
* Ausencia de bloqueos, reinicios o comportamientos anómalos.
* Funcionamiento correcto de todas las funciones dependientes del contenido de la EPROM.
* Estabilidad durante operación prolongada.

**Diagnóstico en caso de fallo**

Si el sistema no funciona correctamente:

* Revisar nuevamente la verificación ([Step 4](#id-4.-verificacion-de-la-grabacion)).
* Confirmar que el fichero programado corresponde a la versión correcta.
* Verificar contactos físicos del zócalo y estado de los pines.
* Comprobar compatibilidad eléctrica y lógica de la EPROM con la placa.
* Repetir el proceso completo si es necesario.


# Upgrade Firmware WiFi Arduino GIGA

La actualización del firmware WiFi en la Arduino GIGA R1 WiFi consiste en la reprogramación del módulo de radio integrado (Murata CYW4343W) que gestiona las comunicaciones IEEE 802.11 y Bluetooth LE,

<figure><img src="/files/NeR0vnQbxtw2zDpz8rMk" alt=""><figcaption></figcaption></figure>

Requisitos:

* [Arduino GIGA R1](https://amzn.to/44vzSnb)
* [Arduino IDE](https://www.arduino.cc/en/software/)

\
El proceso implica cargar una imagen binaria del firmware del módulo WiFi (y sus certificados asociados) en la memoria flash del coprocesador de comunicaciones mediante un sketch (`WiFiFirmwareUpdater`) ejecutado en el entorno Arduino Mbed OS. Este sketch establece una sesión de actualización a través del bus interno entre el MCU principal y el módulo inalámbrico, verificando la versión instalada y permitiendo su sobrescritura si es necesario.

Antes de nada, instalamos el core de la placa Arduino GIGA R1 en Arduino IDE, y conectamos la placa por USB al ordenador.

<figure><img src="/files/40krDfjhJ4ZW0mhKIg0h" alt=""><figcaption></figcaption></figure>

En Arduino IDE:\
***File > Examples > STM32H747\_System > WiFiFirmwareUpdater***

<figure><img src="/files/IeRLHDoYE2mU90d8V0m8" alt=""><figcaption></figcaption></figure>

Se cargara el nuevo sketch, solamente le damos a **Upload** cuando termine, nos preguntara por el monitor serial si deseamos instalar el firmware, le decimos que si "`Y`".

<figure><img src="/files/x9c3lyvaZMYhEAg7kWAE" alt=""><figcaption></figcaption></figure>

Comenzara la actualización del firmware y actualizara los certificados.

```bash
Searching for WiFi firmware file 4343WA1.BIN ...
A WiFi firmware is already installed. Do you want to install the firmware anyway? Y/[n] Y
Flashing /wlan/4343WA1.BIN file
Flashed 0%
Flashed 10%
Flashed 20%
Flashed 30%
Flashed 40%
Flashed 50%
Flashed 60%
Flashed 70%
Flashed 80%
Flashed 90%
Flashed 100%
Erasing memory mapped firmware area...
Flashing memory mapped firmware
Flashed 0%
Flashed 10%
Flashed 20%
Flashed 30%
Flashed 40%
Flashed 50%
Flashed 60%
Flashed 70%
Flashed 80%
Flashed 90%
Flashed 100%
Flashing certificates
Flashed 0%
Flashed 10%
Flashed 20%
Flashed 30%
Flashed 40%
Flashed 50%
Flashed 60%
Flashed 70%
Flashed 80%
Flashed 90%
Flashed 100%
```

Cuando termine, veremos este mensaje

```bash
Firmware and certificates updated!
It's now safe to reboot or disconnect your board.
```

Desconectamos la placa y tendremos actualizado el firmware de la wifi y los certificados ✅


# Hardware


# Overclocking AMD Ryzen 9 5950X

⚠️ Usalo bajo tu propia responsabilidad ⚠️

<figure><img src="/files/9xw5yT6j4qwxtyCs1kaT" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/9VjFYoodA7gO9K2fVA2W" alt=""><figcaption></figcaption></figure>

**Motherboard:** Aorus X570 Elite\
**Version bios:** [F37](https://www.gigabyte.com/latam/Motherboard/X570-AORUS-ELITE-rev-10/support#support-dl-bios)

| Specifications   | value   |
| ---------------- | ------- |
| Codename         | Vermeer |
| CPU Cores        | 16      |
| Threads          | 32      |
| Max. Boost Clock | 4.9Ghz  |
| Base Clock       | 3.4GHz  |
| L2 Cache         | 8Mb     |
| L3 Cache         | 64Mb    |
| CPU Socket       | AM4     |
| Default TDP      | 105W    |

\
\
**Tweaker**

| key                       | value            |
| ------------------------- | ---------------- |
| Core Performance Boost    | Auto             |
| SVM Mode                  | Enabled          |
| AMD Cool\&Quiet function  | Enabled          |
| PPC Adjustment            | PState 0         |
| Global C-state Control    | Enabled          |
| Power Supply idle Control | Low Current Idle |
| CCD Control               | Auto             |
| Downcore Control          | Auto             |
| SMT Mode                  | Auto             |
| CPPC                      | Auto             |
| CPPC Preferred Cores      | Auto             |

\
**Settings**

| key                 | value   |
| ------------------- | ------- |
| Above 4G Decoding   | Enabled |
| Re-Size BAR Support | Enabled |

\
**Settings / Manual CPU Overclocking**

| key           | value |
| ------------- | ----- |
| CPU Frecuency | 4550  |
| CPU Voltage   | 1238  |
| CCD Control   | Auto  |
| Core Control  | Auto  |
| SMT Control   | Auto  |


# Unboxing Switch POE TP-Link TL-SG1008P

Rev. 6.0

[Link de compra en Amazon](https://amzn.to/3IXdJnE) ![](/files/y4oIrJvLjGAfmnhqXq3p)

![](/files/yYNrfV62BUG1GVFYnylg) ![](/files/BGCUSA57wdyYUkGvxr7e) ![](/files/LgITYRihIEfG1wIYkf7b) ![](/files/1YogQi39K3328mjFBZgL) ![](/files/aXBEHIfuIbmmGN5fVbRG) ![](/files/gMFOg6Mrr5we1VjWEG3v) ![](/files/ERA85ZmewNWk8zDMj3jJ) ![](/files/EH7SamXKhfV73o7fX3YV) ![](/files/vg09UzsLbvq5rTXSyz73) ![](/files/7RBnRKjFlPylRfZjwxfW) ![](/files/dO8ITGSCcl2TyoF98qiK)

| **CARACTERÍSTICAS DE HARDWARE**  |                                                                                                                                                                                                                                                                                                                  |
| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Interfaz                         | <p>8 puertos RJ45 de 10/100/1000 Mbps<br>Negociación AUTOMÁTICA/MDI AUTOMÁTICO/MDIX</p>                                                                                                                                                                                                                          |
| Medios de Red                    | <p>10BASE-T: cable UTP categoría 3, 4, 5 (máximo 100 m)<br>EIA/TIA-568 100 Ω STP (máximo 100 m)<br>100BASE-TX: UTP categoría 5, cable 5e (máximo 100m)<br>EIA/TIA-568 100 Ω STP (máximo 100 m)<br>1000BASE-T: cable UTP categoría 5, 5e, 6 o superior (máximo 100 m)<br>EIA/TIA-568 100 Ω STP (máximo 100 m)</p> |
| Cantidad de Ventiladores         | Sin ventilador                                                                                                                                                                                                                                                                                                   |
| Bloqueo de Seguridad Físico      | No                                                                                                                                                                                                                                                                                                               |
| Fuente de Alimentación Externa   | Adaptador de corriente externo (Salida: 48 VCC / 1,25 A)                                                                                                                                                                                                                                                         |
| Tasa de Reenvío de Paquetes      | 11.904 Mpps                                                                                                                                                                                                                                                                                                      |
| Puertos PoE (RJ45)               | <p>Estándar: compatible con 802.3af<br>Puertos PoE: Puerto 1- Puerto 4<br>Fuente de alimentación: 64W</p>                                                                                                                                                                                                        |
| Ancho de Banda de la Red Central | 16Gbps                                                                                                                                                                                                                                                                                                           |
| Tabla de Dirección MAC           | 4K                                                                                                                                                                                                                                                                                                               |
| Jumbo Frame                      | 16 KB                                                                                                                                                                                                                                                                                                            |
| Capacidad de Conmutación         | 16 Gbps                                                                                                                                                                                                                                                                                                          |
| Dimensiones                      | 6.7\*3.9\*1.1 in. (171\*98\*27 mm)                                                                                                                                                                                                                                                                               |
| Consumo de Potencia Máximo       | <p>11,52 W (220 V/50 Hz. sin PD conectado)<br>73,74 W (220 V/50 Hz. con PD de 64 W conectado)</p>                                                                                                                                                                                                                |
| Disipación máxima de calor       | <p>39,30 BTU/h (sin PD conectado)<br>251,59 BTU/h (con PD de 64 W conectado)</p>                                                                                                                                                                                                                                 |

| **CARACTERÍSTICAS DE SOFTWARE** |                                                                                                                                                                              |
| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Método de Transmisión           | Almacenamiento y reenvío                                                                                                                                                     |
| Funciones Avanzadas             | <p>Compatible con POE 802.3af<br>Función de prioridad<br>Autoaprendizaje y envejecimiento automático de direcciones Mac<br>Control de flujo EEE802.3x<br>QoS 802.1p/DSCP</p> |

| **OTROS**             |                                                                                                                                                                                                                                                               |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Certificaciones       | CE, FCC, RoHS                                                                                                                                                                                                                                                 |
| Contenido del Paquete | TL-SG1008P, adaptador de corriente, guía de instalación, patas de goma                                                                                                                                                                                        |
| Factores Ambientales  | <p>Temperatura de funcionamiento: 0°C<del>40°C (32°F</del>104°F)<br>Temperatura de almacenamiento: -40°C<del>70°C (-40°F</del>158°F)<br>Humedad de funcionamiento: 10 % \~ 90 % sin condensación<br>Humedad de almacenamiento: 5 %\~90 % sin condensación</p> |


# Garmin


# Actualizar firmware eTrex 30x

Para actualizar el firmware del GPS, descargamos Garmin Express\
\- [MacOS](https://download.garmin.com/omt/express/GarminExpress.dmg)\
\- [Windows](https://download.garmin.com/omt/express/GarminExpress.exe)

<figure><img src="/files/Lb2jYoTWq3sP4Qk7Gz04" alt="" width="128"><figcaption></figcaption></figure>

\
Conectamos por USB el GPS al ordenador y esperamos a que el ordenador lo reconozca, aparecera como una unidad de almacenamiento mas.\
\
Abrimos el programa Garmin Express

<figure><img src="/files/X7xV8ziLEvInVbbpZFKp" alt=""><figcaption></figcaption></figure>

Nos reconocera el GPS, y nos mostrara si tenemos una version de software nueva.

<figure><img src="/files/S4ozLpGmadcSXw8INTwV" alt=""><figcaption></figcaption></figure>

Si pinchamos en "**Ver detalles**" podemos ver la lista de nuevas versiones

<figure><img src="/files/KZ2f8sSsmldYj7F0dbJX" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Importante, asegurate de que las pilas AA tengan carga suficiente y no retires las pilas durante el proceso.
{% endhint %}

<figure><img src="/files/Cv56IGN5lMcker6sfM8A" alt=""><figcaption></figcaption></figure>

Le damos a continuar... y esperamos porque es LENTO!!!

<figure><img src="/files/F7Nup9aeK9D0KeLE7XCK" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/tB1o6zOnvwAL4fuBo7s5" alt=""><figcaption></figcaption></figure>

Cuando termine, nos mostrara este mensaje

<figure><img src="/files/GRvdTGtwqT6LwlFUBZzG" alt=""><figcaption></figcaption></figure>

Desconectamos el GPS, y le quitamos las pilas, el proximo arranque del GPS es muy lento, ya que tiene que generar la BBDD.

<figure><img src="/files/ALQdm2btTzHDZ18JxPDa" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
No lo apagues ni retires las pilas en el proceso
{% endhint %}


# Hacer capturas de pantalla

Lo primero sera acceder al menú del Garmin, entramos en:

`Configuración > Pantalla > Captura de pantalla > Activado`.

<div><figure><img src="/files/j4mIOjuV8zIlWqQqk7hD" alt=""><figcaption></figcaption></figure> <figure><img src="/files/XmDOLiQkM2FAh1c5BxrB" alt=""><figcaption></figcaption></figure> <figure><img src="/files/4cclEnGPUE1B57yn11Qm" alt=""><figcaption></figcaption></figure> <figure><img src="/files/RMWeFXWcffAM63FfxFW3" alt=""><figcaption></figcaption></figure> <figure><img src="/files/etu9BEe9poxSBreakMNG" alt=""><figcaption></figcaption></figure></div>

{% hint style="info" %}
El modo se desactiva cuando apagues el GPS
{% endhint %}

Para hacer una captura de pantalla, nos situamos en la pantalla que queremos capturar, y solo hay que pulsar una vez el botón de encendido/light.

<figure><img src="/files/3RSMOERFmkAV8cKG6ftO" alt=""><figcaption></figcaption></figure>

Las capturas de pantalla se guardan en la memoria interna del GPS en formato BMP

```bash
jose@debian:~/media/jose/GARMIN/Garmin/scrn$ ls -l
total 3876
-rw-r--r-- 1 jose jose 230454 ago  7 22:50 1472.bmp
-rw-r--r-- 1 jose jose 230454 ago  7 22:50 1475.bmp
-rw-r--r-- 1 jose jose 230454 ago  7 22:50 324.bmp
-rw-r--r-- 1 jose jose 230454 ago  7 22:50 337.bmp
-rw-r--r-- 1 jose jose 230454 ago  7 22:50 347.bmp
-rw-r--r-- 1 jose jose 230454 ago  7 22:50 364.bmp
-rw-r--r-- 1 jose jose 230454 ago  7 22:50 510.bmp
-rw-r--r-- 1 jose jose 230454 ago  7 22:50 51.bmp
-rw-r--r-- 1 jose jose 230454 ago  7 22:50 532.bmp
-rw-r--r-- 1 jose jose 230454 ago  7 22:50 543.bmp
-rw-r--r-- 1 jose jose 230454 ago  7 22:50 557.bmp
-rw-r--r-- 1 jose jose 230454 ago  7 22:50 55.bmp
-rw-r--r-- 1 jose jose 230454 ago  7 22:50 570.bmp
-rw-r--r-- 1 jose jose 230454 ago  7 22:50 62.bmp
-rw-r--r-- 1 jose jose 230454 ago  7 22:50 71.bmp
-rw-r--r-- 1 jose jose 230454 ago  7 22:50 75.bmp
-rw-r--r-- 1 jose jose 230454 ago  7 22:50 806.bmp
```

{% hint style="info" %}
Aunque tengas una MicroSD instalada, no se guardan las capturas en la MicroSD
{% endhint %}


# Mi configuración

<div><figure><img src="/files/7GkZJ1Lr7XP8C1hE5ZEw" alt=""><figcaption></figcaption></figure> <figure><img src="/files/6JGnQe6DNi5Ok7lB4K1Y" alt=""><figcaption></figcaption></figure> <figure><img src="/files/HKmQ9Go9IDIxl6NnwhrJ" alt=""><figcaption></figcaption></figure></div>

<div><figure><img src="/files/VLFweWagP29lY8DrNIlp" alt=""><figcaption></figcaption></figure> <figure><img src="/files/XmDOLiQkM2FAh1c5BxrB" alt=""><figcaption></figcaption></figure> <figure><img src="/files/RMWeFXWcffAM63FfxFW3" alt=""><figcaption></figcaption></figure></div>

<div><figure><img src="/files/fJmeTLvA5F612Do9sHX6" alt=""><figcaption></figcaption></figure> <figure><img src="/files/x5npHT95VfLP7XzrVUw7" alt=""><figcaption></figcaption></figure> <figure><img src="/files/NBGrOX4VniA4oz9hVa0w" alt=""><figcaption></figcaption></figure></div>

Mapas OSM (*España peninsula, Islas Canarias e Islas Baleares*) actualizados cada semana:

<p align="center"><a href="https://github.com/azagramac/OSMforGarmin" class="button primary" data-icon="github-alt">Github</a></p>

<div><figure><img src="/files/5uWi96x3lSQk71j1v0Bh" alt=""><figcaption></figcaption></figure> <figure><img src="/files/Az0xdZvXvwtIz9PioHjf" alt=""><figcaption></figcaption></figure> <figure><img src="/files/3lVRHt58JXPIQygFXGy0" alt=""><figcaption></figcaption></figure></div>


# Yubikey


# Preparar env en Debian 13

En linux disponemos de unas herramientas para sacar partido a las llave Yubikey.<br>

<figure><img src="/files/aWrKouSmJhIqTTf3CGAw" alt=""><figcaption></figcaption></figure>

**📦 Instalación de paquetes:**

```bash
sudo apt install -y gnupg2 scdaemon yubikey-manager pcscd pcsc-tools libccid
```

Habilitamos el servicio

```bash
sudo systemctl enable --now pcscd
```

output:

```bash
Synchronizing state of pcscd.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable pcscd
Created symlink '/etc/systemd/system/sockets.target.wants/pcscd.socket' → '/usr/lib/systemd/system/pcscd.socket'.
```

\
Comprobamos que se está ejecutando:

```bash
systemctl status pcscd
```

output:

```bash
● pcscd.service - PC/SC Smart Card Daemon
     Loaded: loaded (/usr/lib/systemd/system/pcscd.service; indirect; preset: enabled)
     Active: active (running) since Thu 2025-12-11 13:39:51 CET; 5s ago
 Invocation: 38a214155ba9490c89f78196ebe85bb8
TriggeredBy: ● pcscd.socket
       Docs: man:pcscd(8)
   Main PID: 5074 (pcscd)
      Tasks: 5 (limit: 76857)
     Memory: 2.2M (peak: 2.9M)
        CPU: 71ms
     CGroup: /system.slice/pcscd.service
             └─5074 /usr/sbin/pcscd --foreground --auto-exit
```

🔑 **Conectamos la Yubikey al equipo, y si ha ido bien veremo información de nuestra llave:**

```bash
ykman info
```

output:

```bash
Device type: YubiKey 5C NFC
Serial number: ********
Firmware version: 5.7.4
Form factor: Keychain (USB-C)
Enabled USB interfaces: OTP, FIDO, CCID
NFC transport is enabled

Applications	USB    	NFC    
Yubico OTP  	Enabled	Enabled
FIDO U2F    	Enabled	Enabled
FIDO2       	Enabled	Enabled
OATH        	Enabled	Enabled
PIV         	Enabled	Enabled
OpenPGP     	Enabled	Enabled
YubiHSM Auth	Enabled	Enabled
```

✅ 🎉 Bien!!! te detecta la llave perfectamente!

**⚙️ Personalización**

```bash
gpg --card-status
```

output:

```bash
Reader ...........: Yubico YubiKey OTP FIDO CCID 00 00
Application ID ...: D********************************
Application type .: OpenPGP
Version ..........: 3.4
Manufacturer .....: Yubico
Serial number ....: ********
Name of cardholder: [no establecido]
Language prefs ...: [no establecido]
Salutation .......: 
URL of public key : [no establecido]
Login data .......: [no establecido]
Signature PIN ....: no forzado
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
KDF setting ......: off
UIF setting ......: Sign=off Decrypt=off Auth=off
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]
```

Si has llegado a este punto y no has tenido problemas, tienes lo necesario para administrar la llave en Linux.

{% hint style="danger" %}
Es posible que te de problemas gpg --card-status
{% endhint %}

Si al ejecutar:

```bash
gpg --card-status
```

Te sale este output:

```bash
gpg: selecting card failed: Service is not running
gpg: tarjeta OpenPGP no disponible: Service is not running
```

Ejecuta:

```bash
gpgconf --kill gpg-agent
gpgconf --launch gpg-agent
gpg --card-status
```

y ya deberia solucionar el problema.


# Generar claves GPG en la Yubikey

<figure><img src="/files/oyzw26fuoFStgD8zXMtb" alt=""><figcaption></figcaption></figure>

Vamos a generar una clave GPG en la propia llave con copia de seguridad de la clave privada en nuestro equipo.

Verificamos que el sistema reconoce la llave

```bash
gpg --card-status
```

output:

```bash
Reader ...........: Yubico YubiKey OTP FIDO CCID 00 00
Application ID ...: D*******************************
Application type .: OpenPGP
Version ..........: 3.4
Manufacturer .....: Yubico
Serial number ....: ********
Name of cardholder: [no establecido]
Language prefs ...: [no establecido]
Salutation .......: 
URL of public key : [no establecido]
Login data .......: [no establecido]
Signature PIN ....: no forzado
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
KDF setting ......: off
UIF setting ......: Sign=off Decrypt=off Auth=off
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]
```

✅ 🎉

Si tienes esta salida, continuamos.

Ahora vamos a "entrar" en la llave para crear la clave GPG y algunos ajustes mas...

```bash
gpg --card-edit
```

Ahora nos saldrá un prompt de GPG, desde el cual vamos a usar:

```bash
gpg/card>
```

Entramos como administrador, desde este momento eres `root` en la Yubikey

```bash
gpg/card> admin
Se permiten órdenes de administrador
```

Lo primero cambiamos UIF que por defecto es: `Sign=off Decrypt=off Auth=off`

```bash
gpg/card> uif
usage: uif N [on|off|permanent]
       1 <= N <= 3
```

La forma de cambiar, es `{comando} {posicion} {estado}`

Marcamos como "**on**" las posiciones, Sig, Encrypt y Auth.

```bash
gpg/card> uif 1 on # Signature
gpg/card> uif 2 on # Encryption
gpg/card> uif 3 on # Authentication
gpg/card> quit
```

Comprobamos el cambio:

```bash
gpg --card-status
```

output:

```bash
Reader ...........: Yubico YubiKey OTP FIDO CCID 00 00
Application ID ...: D*******************************
Application type .: OpenPGP
Version ..........: 3.4
Manufacturer .....: Yubico
Serial number ....: ********
Name of cardholder: [no establecido]
Language prefs ...: [no establecido]
Salutation .......: 
URL of public key : [no establecido]
Login data .......: [no establecido]
Signature PIN ....: no forzado
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
KDF setting ......: off
UIF setting ......: Sign=on Decrypt=on Auth=on
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]
```

Verificamos que "**UIF setting**" ahora están los valores en "**on**".

```bash
UIF setting ......: Sign=on Decrypt=on Auth=on
```

\
Entramos de nuevo en la llave.

```bash
gpg --card-edit
```

Entramos como administrador.

```bash
gpg/card> admin
Se permiten órdenes de administrador
```

<figure><img src="/files/4aKevVPTW31MxJACJcIt" alt="" width="188"><figcaption></figcaption></figure>

🔐 **Generamos la clave GPG**

Lo primero que nos preguntará es si queremos copia de seguridad de la clave privada, se guardara en el sistema, si le decimos que no, la clave privada estara únicamente en la Yubikey.

```bash
gpg/card> generate
¿Hacer copia de seguridad externa a la tarjeta de clave de cifrado? (S/n)
```

{% hint style="info" %}
Nos pedirá el PIN de usuario, lo metemos, si no has cambiado el PIN, es `123456`
{% endhint %}

\
Lo siguiente es especificar el período de validez de la clave, selecciona la opción deseada.

```bash
Por favor, especifique el período de validez de la clave.
         0 = la clave nunca caduca
      <n>  = la clave caduca en n días
      <n>w = la clave caduca en n semanas
      <n>m = la clave caduca en n meses
      <n>y = la clave caduca en n años
¿Validez de la clave (0)? 0
¿Es correcto? (s/n) s
```

Nos realizará una serie de preguntas:

```bash
¿Es correcto? (s/n) s

GnuPG debe construir un ID de usuario para identificar su clave.

Nombre y apellidos: INTRODUCE TU NOMBRE
Dirección de correo electrónico: INTRODUCE TU MAIL
Comentario: INTRODUCIR COMENTARIO
Ha seleccionado este ID de usuario:
    "NOMBRE (COMENTARIO) <MAIL>"

¿Cambia (N)ombre, (C)omentario, (D)irección o (V)ale/(S)alir? V
```

Aqui tardara un poco, pero en unos segundos nos habrá generado la clave GPG.

```bash
Es necesario generar muchos bytes aleatorios. Es una buena idea realizar
alguna otra tarea (trabajar en otra ventana/consola, mover el ratón, usar
la red y los discos) durante la generación de números primos. Esto da al
generador de números aleatorios mayor oportunidad de recoger suficiente
entropía.
gpg: NOTA: copia de seguridad de la clave guardada en '/home/$USER/.gnupg/sk_******************.gpg'
gpg: creado el directorio '/home/$USER/.gnupg/openpgp-revocs.d'
gpg: certificado de revocación guardado como '/home/$USER/.gnupg/openpgp-revocs.d/{{ ID DE LA CLAVE }}.rev'
claves pública y secreta creadas y firmadas.

pub   rsa2048 2025-12-02 [SC]
      {{ ID DE LA CLAVE }}
uid                      NOMBRE (COMENTARIO) <MAIL>
sub   rsa2048 2025-12-02 [A]
sub   rsa2048 2025-12-02 [E]
```

Ya tienes la clave GPG generada y la copia de seguridad en el sistema. ✅ 🎉

**Exportar la clave pública.** La clave que nos tenemos que fijar es la marcada como `[SC]`

```bash
gpg --export -a {{ ID DE LA CLAVE }} > yubikey_public.asc
```

Nos dejará el fichero en el directorio que nos encontremos, contiene la clave pública, que podemos usar en Github, etc...

**Publicar la clave publica en** [keys.openpgp.org](https://keys.openpgp.org/)

```bash
gpg --send-keys {{ ID DE LA CLAVE }} --keyserver keys.openpgp.org
```

Instante después es nos llegará un mail, para verificar la publicación de la clave.

Tan solo confirmar pinchando en el link facilitado.

<figure><img src="/files/BLkfMxXStcf10CTK1Fjz" alt=""><figcaption></figcaption></figure>

y si ademas queremos verificar el mail con la clave publica, nos llegara otro mail.

<figure><img src="/files/3LAMhkB7PU2vAbJVlYef" alt=""><figcaption></figcaption></figure>

Ya tendremos nuestra clave pública disponible, podemos verificarla directamente entrando en la web [keys.openpgp.org](https://keys.openpgp.org/) y poniendo el id de la clave o mail

<figure><img src="/files/hFl9omHrtHx8mnHh9zl1" alt=""><figcaption></figcaption></figure>

Ahora vamos a personalizarla.

```bash
gpg --card-edit
```

Accedemos como admin

```bash
gpg/card> admin
Se permiten órdenes de administrador
```

\
Le asignamos un titular, nos preguntara apellido y nombre.

```bash
gpg/card> name
Apellido del titular de la tarjeta: Apellido1 Apellido2
Nombre del titular de la tarjeta: Nombre
```

\
Ahora la URL de la clave pública, nos preguntara por la URL, para ello debemos entrar en la web citada antes, y copia la dirección de la clave, que descargara un fichero `.asc`

```bash
gpg/card> url
URL de donde recuperar la clave pública: https://keys.openpgp.org/vks/v1/by-fingerprint/{{ ID DE LA CLAVE }}
```

\
Metemos el mail o login habitual que usemos con nuestra clave GPG

```bash
gpg/card> login
Datos de login (nombre de la cuenta): INTRODUCE tu nick o mail
```

\
y por ultimo el idioma, por defecto ingles.

```bash
gpg/card> lang
Preferencias de idioma: es
```

\
Salimos y comprobamos los cambios.

```bash
gpg/card> quit
gpg --card-status
```

output:

```bash
Reader ...........: Yubico YubiKey OTP FIDO CCID 00 00
Application ID ...: D*******************************
Application type .: OpenPGP
Version ..........: 3.4
Manufacturer .....: Yubico
Serial number ....: ********
Name of cardholder: ************************
Language prefs ...: es
Salutation .......: 
URL of public key : https://keys.openpgp.org/vks/v1/by-fingerprint/*************
Login data .......: ************************
Signature PIN ....: no forzado
Key attributes ...: rsa4096 rsa4096 rsa4096
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 5
KDF setting ......: off
UIF setting ......: Sign=on Decrypt=on Auth=on
Signature key ....: **** **** **** **** ****  **** **** **** **** ****
      created ....: 2025-12-02 13:43:28
Encryption key....: **** **** **** **** ****  **** **** **** **** ****
      created ....: 2025-12-02 13:43:28
Authentication key: **** **** **** **** ****  **** **** **** **** ****
      created ....: 2025-12-02 13:43:28
General key info..: pub  rsa2048/************* 2025-12-02 ************* (*********) <**************>
sec>  rsa2048/*************  creado: 2025-12-11  caduca: nunca     
                                num. tarjeta: 0006 ********
ssb>  rsa2048/*************  creado: 2025-12-11  caduca: nunca     
                                num. tarjeta: 0006 ********
ssb>  rsa2048/*************  creado: 2025-12-11  caduca: nunca     
                                num. tarjeta: 0006 ********

```

Nos fijamos que los campos se han cambiado:

```bash
Language prefs ...: es
Name of cardholder: ************************
Login data .......: ************************
URL of public key : https://keys.openpgp.org/vks/v1/by-fingerprint/*************
```

✅ 🎉


# Linux


# Possible missing firmware /lib/firmware/amdgpu

<figure><img src="/files/UMvx6G6GaFCMEkcVuGVL" alt=""><figcaption></figcaption></figure>

Clonar el repositorio de linux-firmware

```bash
git clone https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
```

de la lista que nos da el error, la copiamos, dejando solo el nombre del binario que nos falta.\
\
Ejemplo, estos son los binarios que me indicaba que no los tenia:

```bash
W: Possible missing firmware /lib/firmware/amdgpu/ip_discovery.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/vega10_cap.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/sienna_cichlid_cap.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/navi12_cap.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/psp_13_0_11_ta.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/psp_13_0_11_toc.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/psp_13_0_10_ta.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/psp_13_0_10_sos.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/aldebaran_cap.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_3_imu.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_4_rlc.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_4_mec.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_4_me.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_4_pfp.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_3_rlc.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_3_mec.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_3_me.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_3_pfp.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_0_toc.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/sdma_6_0_3.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/sienna_cichlid_mes1.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/sienna_cichlid_mes.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/navi10_mes.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_4_mes1.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_4_mes_2.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_4_mes.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_3_mes1.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_3_mes_2.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_3_mes.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_2_mes_2.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_1_mes_2.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/gc_11_0_0_mes_2.bin for module amdgpu
W: Possible missing firmware /lib/firmware/amdgpu/smu_13_0_10.bin for module amdgpu
```

Creamos el fichero, dejando solo el nombre del binario y lo guardamos donde queramos, puede ser mismamente dentro de, ejemplo: `/home/$USER/linux-firmware/amdgpu`

```bash
ip_discovery.bin
vega10_cap.bin
sienna_cichlid_cap.bin
navi12_cap.bin
psp_13_0_11_ta.bin
psp_13_0_11_toc.bin
psp_13_0_10_ta.bin
psp_13_0_10_sos.bin
aldebaran_cap.bin
gc_11_0_3_imu.bin
gc_11_0_4_rlc.bin
gc_11_0_4_mec.bin
gc_11_0_4_me.bin
gc_11_0_4_pfp.bin
gc_11_0_3_rlc.bin
gc_11_0_3_mec.bin
gc_11_0_3_me.bin
gc_11_0_3_pfp.bin
gc_11_0_0_toc.bin
sdma_6_0_3.bin
sienna_cichlid_mes1.bin
sienna_cichlid_mes.bin
navi10_mes.bin
gc_11_0_4_mes1.bin
gc_11_0_4_mes_2.bin
gc_11_0_4_mes.bin
gc_11_0_3_mes1.bin
gc_11_0_3_mes_2.bin
gc_11_0_3_mes.bin
gc_11_0_2_mes_2.bin
gc_11_0_1_mes_2.bin
gc_11_0_0_mes_2.bin
smu_13_0_10.bin
```

Y ahora lanzamos un bucle `for`, para que copie cada archivo de esa lista que tenemos en el repositorio que hemos descargado en la ruta `/lib/firmware/amdgpu/`.

```bash
for file in $(<lista.txt); do sudo cp "$file" /lib/firmware/amdgpu/; done
```

y actualizamos el `initramfs` con los nuevos cambios

```bash
sudo update-initramfs -k all -u
```

{% hint style="info" %}
Seguramente que falte algún binario por copiar.
{% endhint %}

Y reiniciamos


# Cifrar con LUKS

<figure><img src="/files/9J9N1aiNGNucOcECCwFv" alt=""><figcaption></figcaption></figure>

LUKS (del inglés Linux Unified Key Setup, Configuración de clave unificada de Linux), completamente de código abierto, opera a nivel de núcleo y emplea el subsistema device mapper a través del módulo dm-crypt.\
\
En este tutorial vamos a crear una partición cifrada con autenticación desde un fichero y desde contraseña, mas adelante quiero implementar la autenticación con el modulo TPM2.

Vamos a crear una partition con una longitud de clave de 512 bit y un hash de SHA-512.

Supongamos que tenemos un pendrive y queremos guardar en el información sensible, nos vale un disco duro externo también.

Mi recomendación es crear al menos 2 particiones en el dispositivo externo, la primera pequeña, si puede ser de al menos 1Gb perfecto, si puedes mas, mejor, para ficheros temporales y en FAT32.

{% hint style="warning" %}
No me guardes en esa partición la clave de la partición cifrada
{% endhint %}

y la otra partición con el tamaño restante del dispositivo, creamos una partición formateada en EXT4, esto nos da igual ahora mismo, ya que vamos crear el volumen cifrado y luego lo vamos a formatear.\
\
Aquí tengo mi HDD externo de 1Tb con 2 particiones, lo que comentaba, la primera de 32GB en FAT32, sin cifrado y la segunda con el resto de capacidad cifrada y formateada en EXT4.

<figure><img src="/files/6DTFyCuFuuXTCOSiwsmP" alt=""><figcaption></figcaption></figure>

Para cifrar una partición y la autenticación con fichero, con una longitud de clave de 512 bit y un hash SHA-512, donde `/dev/sdaX` cambiarlo por la partición que os corresponda.

{% hint style="info" %}
Estos pasos formatean el contenido del dispositivo, lo que tenga se va borrar y no sera recuperable.
{% endhint %}

```sh
sudo cryptsetup luksFormat --cipher=aes-xts-plain64 --key-size=512 --hash=sha512 --use-random /dev/sdaX
```

y en un momento tendremos la partición cifrada, pero aun no hemos terminado.

\
Ahora vamos a darle formato, antes de nada debemos desbloquear la partición. Podemos poner el nombre que queramos.

```sh
sudo cryptsetup luksOpen /dev/sdaX {nombre}
```

Y la formateamos, en este caso de tipo ext4

```sh
sudo mkfs.ext4 /dev/mapper/{nombre}
```

La volvemos a bloquear una vez terminado el formateo de la partición.

```sh
sudo cryptsetup luksClose {nombre}
```

Y ya tenemos nuestro dispositivo cifrado y bien cifrado, ya puedes memorizar bien la clave, no la dejes junto con el dispositivo.

Podemos ver la cabecera de LUKS de nuestro dispositivo con

```sh
sudo cryptsetup luksDump /dev/sdaX
```

\
Y nos devolverá algo similar:

```sh
LUKS header information
Version:       	2
Epoch:         	3
Metadata area: 	16384 [bytes]
Keyslots area: 	16744448 [bytes]
UUID:          	fe223394-1612-8c20-9a0b-ac6e202294a2
Label:         	(no label)
Subsystem:     	(no subsystem)
Flags:       	(no flags)

Data segments:
  0: crypt
	offset: 16777216 [bytes]
	length: (whole device)
	cipher: aes-xts-plain64
	sector: 512 [bytes]

Keyslots:
  0: luks2
	Key:        512 bits
	Priority:   normal
	Cipher:     aes-xts-plain64
	Cipher key: 512 bits
	PBKDF:      argon2id
	Time cost:  14
	Memory:     1048576
	Threads:    4
	Salt:       60 31 f1 b7 6a 6e 55 8c 45 45 a5 b5 ac 18 46 08 
	            64 92 1d 83 2a f4 e3 93 89 2f 26 7a 70 87 3d 0e 
	AF stripes: 4000
	AF hash:    sha512
	Area offset:32768 [bytes]
	Area length:258048 [bytes]
	Digest ID:  0
Tokens:
Digests:
  0: pbkdf2
	Hash:       sha512
	Iterations: 264791
	Salt:       ca ad 4c d3 6e ba 83 2f 4f 70 c7 0c 11 91 24 e7 
	            cf 73 a6 5a 7c 43 4c 37 28 3b 1b 57 5b c3 6d 6c 
	Digest:     e3 38 c7 ea 0a 58 14 c6 8e 24 ae 8f 45 57 d4 55 
	            34 79 ca 0b a6 b5 45 bc 83 ee 1e e9 6a f6 de c6 
	            62 40 d2 57 ae 71 e0 f6 29 3c e8 86 c9 31 1f b2 
	            ed 44 57 6d d5 94 e3 de 60 64 88 f2 f4 ab 34 bb
```

Nos interesa de esa cabecera los puntos:

```bash
Key:        512 bits
Cipher:     aes-xts-plain64
Hash:       sha512
```

Si conectamos nuestro disco externo, nos pedirá la contraseña para desbloquear la partición cifrada.

<figure><img src="/files/Fi0gjMSpcbbVEgABxQkU" alt=""><figcaption></figcaption></figure>

Esto lo podemos aplicar para cifrar un disco antes de instalar el sistema operativo, lo que probado Fedora 41, Anaconda si detecta el cifrado LUKS si lo has cifrado previamente y puedes instalar el sistema operativo (marcando sin cifrar), en cada inicio luego te pide las password para continuar el arranque, cuidado con cifrar /boot y EFI. Un gallifante para Fedora por el buen trabajo de integración de Anaconda con LUKS.\
\
En Debian 12.9 no detecta LUKS, con lo que si esta cifrado instalará encima el sistema normalmente pisando lo que tenga el disco. Mal Debian, MAL!!!


# Habilitar FSR en los juegos en Steam

<figure><img src="/files/CTBTbQVhBKUUzh5C3CQM" alt=""><figcaption></figcaption></figure>

Para habilitar el FSR ( FidelityFX Super REsolution ) solamente v1.0, en los juegos que usen Vulkan que tengamos en Steam, primero instalar Steam en nuestra distribucion Linux, en GNU/Linux Debian 12.1 va increiblemente genial.\
\
Al margen de la version que usemos de Proton en nuestros juegos, vamos a instalar una nueva que nos permita habilitar el FSR.

```sh
sudo apt update && sudo apt install python3-pip -y
```

```sh
pip3 install protonup
```

Ya tenemos protonup instalado. Lo lanzamos

```sh
protonup
```

\
La primera que lo lancemos nos mostrara un mensaje asi, le decimos "y" para comenzar la instalacion.

```
Ready to download Proton-8.16-GE
Size      : 423.81 MiB
Published : 2023-09-20
Continue? (Y/N):
```

\
Luego podremos verificar que version tenemos instalada.

```sh
$ protonup
[INFO] GE-Proton8-16 already installed
```

Ahora abirmos Steam, y seleccionamos un juego de nuestra biblioteca.

{% hint style="warning" %}
Solo es posible habilitar el FSR en juegos que usen Vulkan (incluidos DXVK y VKD3D-Proton)
{% endhint %}

Seleccionamos un juego y le damos a propiedades.

<figure><img src="/files/tEAO4E7uma7IdWbTmTG1" alt=""><figcaption></figcaption></figure>

En la ventana que se nos abre, en "Compatiblidad" seleccionamos el "GE-Proton" en mi caso es la version 8.16<br>

<figure><img src="/files/5bBo3qNvOqmK4aJoLL6L" alt=""><figcaption></figcaption></figure>

en la pestaña "General" nos desplazamos al final y vemos un campo para meter parametros.<br>

<figure><img src="/files/juQ3WfBgGVpkJyhnDwCx" alt=""><figcaption></figcaption></figure>

Introducimos

```sh
WINE_FULLSCREEN_FSR=1 WINE_FULLSCREEN_FSR_STRENGTH=1 %command%
```

y lanzamos el juego. Si el juego tiene configuracion de FSR, como el caso del Death Stranding, no es necesario usar esta configuracion, podemos jugar con la version del Proton8.0-3 y ajustar el FSR dentro del juego.

`WINE_FULLSCREEN_FSR` = 0 disable / 1 enabled\
`WINE_FULLSCREEN_FSR_STRENGTH` = min 0, max 5, default 2. (0 is maximum sharpness, higher values mean less sharpening)


# Información del /etc/fstab

La forma con la que Linux trata a los dispositivos es muy diferente a como lo hace Windows, en Linux todo es un archivo, `/etc/fstab` es el archivo donde se definen los diferentes puntos de montaje de particiones, discos, unidades de CD, etc...

Como cada fichero en linux, tiene su sintaxis

```sh
<partición>   <punto de montaje>   <formato>   <opciones>   <dump>   <pass>
```

Ejemplo de mi `/etc/fstab` en Debian 12

```sh
## Root & swap
/dev/mapper/debian-root				/		ext4	noatime,nodiratime,discard,errors=remount-ro	0	1
/swapfile					none		swap	sw		                0	0

# /boot was on /dev/nvme0n1p1 during installation
UUID=26d0f059-6334-4db8-835f-9c54b9955524	/boot		ext4    noatime,nodiratime,discard	0	2
UUID=4325-9d14					/boot/efi	vfat	umask=0077	                0	1

## Home
/dev/mapper/debian-home				/home		ext4	noatime,nodiratime,discard	0	2

## Optical Drive
/dev/sr0					/media/cdrom0	udf,iso9660 user,noauto	                0	0

## Synology
//nas/home/$user				/home/$user/NAS	cifs	user=$user,password="4oK/IDFLN2JVODNMdzFMeHpOMmRLV3JMcldqQTUxSERwZnl6V20=",uid=1000,gid=1000,iocharset=utf8,vers=3.0,forceuid,forcegid,noauto,x-systemd.automount,_netdev	0	0

## Folders temp in RAM
tmpfs						/tmp		tmpfs	noatime,nodiratime,nodev,nosuid,mode=1777,defaults	0	0
tmpfs						/var/tmp	tmpfs	noatime,nodiratime,nodev,nosuid,mode=1777,defaults	0	0

## No automount
UUID=df43cc4e-e6eb-8fab-878a-508a61665fcf	/media/$user	ext4	defaults,noauto	0	0
UUID=3ECA-AFFA					/media/$user	vfat	defaults,noauto	0	0
UUID=508a6166-0d9c-4a63-9972-4b46df43cc4e	/media/$user	ext4	defaults,noauto	0	0
UUID=FE4A-F2E1					/media/$user	auto	defaults,noauto	0	0
```

\
**Parámetros:**

`<partición>` define la partición o dispositivo de almacenamiento para ser montado\
`<punto de montaje>` indica el punto de montaje donde la partición será montada\
`<formato>` indica el tipo de sistema de archivos o dispositivo de almacenamiento para ser montado.

Por ejemplo: `ext2`, `ext3`, `ext4`, `reiserfs`, `xfs`, `jfs`, `smbfs`, `iso9660`, `vfat`, `ntfs`, `swap` y `auto`. El tipo auto hace que mount determine qué tipo de sistema de archivos utiliza.

\
`<opciones>` indica las opciones de montaje.

* `auto` – El sistema de archivos será montado automáticamente durante el arranque, o cuando la orden mount -a se invoque.
* `noauto` – El sistema de archivos no será montado automáticamente, solo cuando se le ordene manualmente.
* `exec` – Permite la ejecución de binarios residentes en el sistema de archivos.
* `noexec` – No permite la ejecución de binarios que se encuentren en el sistema de archivos.
* `ro` – Monta el sistema de archivos en modo sólo lectura.
* `rw` – Monta el sistema de archivos en modo lectura-escritura.
* `user` – Permite a cualquier usuario montar el sistema de archivos. Esta opción incluye noexec, nosuid, nodev, a menos que se indique lo contrario.
* `users` – Permite que cualquier usuario perteneciente al grupo users montar el sistema de archivos.
* `nouser` – Solo el usuario root puede montar el sistema de archivos.
* `owner` – Permite al propietario del dispositivo montarlo.
* `sync` – Todo el I/O se debe hacer de forma sincrónica.
* `async` – Todo el I/O se debe hacer de forma asíncrona.
* `dev` – Intérprete de los dispositivos especiales o de bloque del sistema de archivos.
* `nodev` – Impide la interpretación de los dispositivos especiales o de bloques del sistema de archivos.
* `suid` – Permite las operaciones de suid, y sgid bits. Se utiliza principalmente para permitir a los usuarios comunes ejecutar binarios con privilegios concedidos temporalmente con el fin de realizar una tarea específica.
* `nosuid` – Bloquea el funcionamiento de suid, y sgid bits
* `noatime` – No actualiza el inode con el tiempo de acceso al filesystem. Puede aumentar las prestaciones.
* `nodiratime` – No actualiza el inode de los directorios con el tiempo de acceso al filesystem. Puede aumentar las prestaciones (véase opciones atime).
* `relatime` – Actualiza en el inode solo los tiempos relativos a modificaciones o cambios de los archivos. Los tiempos de acceso vienen actualizados solo si el último acceso es anterior respecto al de la última modificación. (Similar a noatime, pero no interfiere con programas como mutt u otras aplicaciones que deben conocer si un archivo ha sido leido después de la última modificación). Puede aumentar las prestaciones.
* `discard` – Emite las órdenes TRIM para dispositivos de bloques subyacentes cuando se liberan los bloques. Recomendado para usar si el sistema de archivos se encuentra en un SSD.
* `flush` – La opción vfat permite eliminar datos con más frecuencia, de modo que los cuadros de diálogo de copia o las barras de progreso se mantenga hasta que se hayan escrito todos los datos.
* `nofail` – Monta el dispositivo cuando está presente, pero ignora su ausencia. Esto evita que se cometan errores durante el arranque para los medios extraíbles.
* `defaults` – Asigna las opciones de montaje predeterminadas que serán utilizadas para el sistema de archivos. Las opciones predeterminadas para ext4 son: rw, suid, dev, exec, auto, nouser, async.

`<dump>` puede valer 0 ó 1 y sirve para indicar si se harán copias de seguridad con la utilidad dump\
`<pass>` sirve para indicar a fsck el orden en que los sistemas de archivos serán comprobados

Hay 3 maneras de identificar una partición o dispositivo

1. Punto de montaje, "/", "/home", swap, etc...
2. Etiquetas, LABEL=linux...
3. UUID, toda particion en Linux, va asignado un UUID que se autogenera al crear la particion.

{% hint style="info" %}
Es posible recargar el fstab sin tener que reiniciar el sistema, `mount -a` y `umount -a`
{% endhint %}


# Instalar Debian cifrado

Instalacion completa de Debian en volumen cifrado con LUKS y particiones logicas

Version instalada. [Debian 12.1.0](https://cdimage.debian.org/debian-cd/current/amd64/iso-dvd/)

<figure><img src="/files/TK3dy1fS30Le3yXAD8d5" alt="" width="375"><figcaption></figcaption></figure>

Despues grabar la ISO en un soporte, sea DVD o USB, arrancamos con ella

<figure><img src="/files/SnrpQOJsCmZvMSfxA6X2" alt=""><figcaption></figcaption></figure>

Configuramos idioma, mapa de teclado...

<div><figure><img src="/files/zZYPZpDk1VaxPAspskZo" alt=""><figcaption></figcaption></figure> <figure><img src="/files/4uHiD8BRnAjtgq2SirqK" alt=""><figcaption></figcaption></figure> <figure><img src="/files/NU1hvHHZsTDU0GrGmhjo" alt=""><figcaption></figcaption></figure> <figure><img src="/files/FodFp6Vztx3VYId674NP" alt=""><figcaption></figcaption></figure></div>

Establecemos el hostname, la password de root, y nuestro usuario y password

<div><figure><img src="/files/8fTAA9nmqyvdw7F8DzHT" alt=""><figcaption></figcaption></figure> <figure><img src="/files/4SKgqUBecxVxPnzEcDQ7" alt=""><figcaption></figcaption></figure> <figure><img src="/files/Zi5QWVP7WghyEz89NFJG" alt=""><figcaption></figcaption></figure> <figure><img src="/files/zdJr0LaxpYofBlpNHRnV" alt=""><figcaption></figcaption></figure> <figure><img src="/files/YHrlBBmr6qZII5d9gS0O" alt=""><figcaption></figcaption></figure> <figure><img src="/files/WCwdk9uUwEnszLgOCC2R" alt=""><figcaption></figcaption></figure></div>

Configuramos nuestro horario

<figure><img src="/files/g9Z81mcbGRqUcD23eHmn" alt=""><figcaption></figcaption></figure>

En particionado de discos, elegiremos "Manual", nos mostrara la lista de dispositivos, lo seleccionamos y creamos una nueva tabla de particiones.

<div><figure><img src="/files/nqNr4imvvR4fIr1yMjND" alt=""><figcaption></figcaption></figure> <figure><img src="/files/PvGRMeuFVlsCUYtk7zSu" alt=""><figcaption></figcaption></figure> <figure><img src="/files/f1Zx0bE3iGxk14vOKHbz" alt=""><figcaption></figcaption></figure></div>

Ya tenemos nuestro disco disponible para configurarlo.

<figure><img src="/files/NiKZ1mNaBcKC969EEgoN" alt=""><figcaption></figcaption></figure>

Ahora crearemos la particion **/boot**, esta particion no va cifrada, si no no seria posible el arranque del sistema, seleccionamos el disco y le damos a "Crear una particion nueva", con 1Gb es suficiente y elegiremos de tipo **primaria**.

<div><figure><img src="/files/AfoIJP2cvlxIDLfQ5xDc" alt=""><figcaption></figcaption></figure> <figure><img src="/files/Jz11aRx5dGz8ivHO1PGN" alt=""><figcaption></figcaption></figure> <figure><img src="/files/Wj5laQmf58fKD0gJOZhN" alt=""><figcaption></figcaption></figure></div>

La ubicacion de la particion sera al principio del disco, y luego le daremos formato Ext4, punto de montaje /boot, y ya habremos terminado con esta particion.

<div><figure><img src="/files/UypNr8BhO1o8cNDZKVFD" alt=""><figcaption></figcaption></figure> <figure><img src="/files/5JCHIomUdP1zrJba0kXI" alt=""><figcaption></figcaption></figure> <figure><img src="/files/N8YBCsiDYApuRebtjIir" alt=""><figcaption></figcaption></figure></div>

Vamos con el volumen cifrado, En espacio libre restante, le damos a "Crear una particion nueva", aqui elegiremos de tipo **logico**, el tamaño pondremos el total disponible, luegro dentro crearemos las particiones para la raiz / y /home.

<div><figure><img src="/files/AfoIJP2cvlxIDLfQ5xDc" alt=""><figcaption></figcaption></figure> <figure><img src="/files/dKWOjdXfmUjWINtnjoaV" alt=""><figcaption></figcaption></figure> <figure><img src="/files/AOxWEeNruC56yVnQQbUm" alt=""><figcaption></figcaption></figure></div>

Configuramos el volumen.

<figure><img src="/files/27P0zo4hCxdXfREvRk5d" alt=""><figcaption></figcaption></figure>

Ahora vamos a configurar el volumen cifrado

<div><figure><img src="/files/UYHFNn4hOs10AN2VZE5P" alt=""><figcaption></figcaption></figure> <figure><img src="/files/TV16P27DTwiEIzqgQwQO" alt=""><figcaption></figcaption></figure></div>

Crearemos el volumen cifrado, marcaremos el dispositivo que hemos configurado previamente

<div><figure><img src="/files/K9kuru8JomBG04T8u4RS" alt=""><figcaption></figcaption></figure> <figure><img src="/files/9mddxViJzojGqEbURecO" alt=""><figcaption></figcaption></figure> <figure><img src="/files/WdcrU7LO9pOVxAixyoWW" alt=""><figcaption></figcaption></figure> <figure><img src="/files/9TVyFuPxGeGT0ffPnI7g" alt=""><figcaption></figcaption></figure></div>

y empezara el proceso, aqui dependiendo de tu equipo llevara mas o menos tiempo.

<figure><img src="/files/OrYeXIJj45uGov08FK4q" alt=""><figcaption></figcaption></figure>

Nos pedira la contraseña que tendremos que poner cada vez que iniciemos el sistema para desbloquear el volumen.

{% hint style="warning" %}
Si pierdes la contraseña, pierdes el acceso a los datos.
{% endhint %}

<figure><img src="/files/YnvkcP4VbXoBF1XkyN3B" alt=""><figcaption></figcaption></figure>

Ya tenemos la particion /boot y el volumen cifrado, ahora nos queda crear las particiones raiz y home.

<figure><img src="/files/3bDfUw7Iq96p0jCQJKjJ" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/BV3R2IgThvQCMIJgHZnn" alt=""><figcaption></figcaption></figure>

Creamos el grupo de volumen que contendra las particiones, podemos asignar el nombre que queramos el grupo de volumen.

<div><figure><img src="/files/QkLFHUcbrmAXQeGjbsgh" alt=""><figcaption></figcaption></figure> <figure><img src="/files/xyKBoGzDFIiliPAhu2yO" alt=""><figcaption></figcaption></figure> <figure><img src="/files/yJwVU3v5A0I5eRDpzUMu" alt=""><figcaption></figcaption></figure></div>

Creamos la particion **raiz /**, asignandole el espacio que queramos, nombre...

<div><figure><img src="/files/9txTYbC9bIoJutq6S4FK" alt=""><figcaption></figcaption></figure> <figure><img src="/files/471rSdwxR1zlZnRfJgH3" alt=""><figcaption></figcaption></figure> <figure><img src="/files/DDC6FsXnQ6OICfBarOPB" alt=""><figcaption></figcaption></figure> <figure><img src="/files/PZdvyDhtkS8vvz6b9fUP" alt=""><figcaption></figcaption></figure></div>

Lo mismo para la particion **/home**

<div><figure><img src="/files/2nNgwjCQo4VU3r9eY0ip" alt=""><figcaption></figcaption></figure> <figure><img src="/files/TTyFNd0gNYtY7ebSoaIe" alt=""><figcaption></figcaption></figure> <figure><img src="/files/Wsm42pZW1KIxRtNJzyEz" alt=""><figcaption></figcaption></figure> <figure><img src="/files/JZdr4H5ZOyxhiVgPs8DM" alt=""><figcaption></figcaption></figure></div>

Ya hemos terminado de crear las particiones, en este ejemplo se han creado solamente 2, puedes crear mas, como la /var y la swap.

<figure><img src="/files/YNqtne02NGWHFORjGSwn" alt=""><figcaption></figcaption></figure>

Ahora nos queda dar formato a las particiones creadas.

<figure><img src="/files/GuSlZQKfpWKbSnfysZlE" alt=""><figcaption></figcaption></figure>

raiz / y /home

<div><figure><img src="/files/KOUpPIxCPvJCBXwTKyhb" alt=""><figcaption></figcaption></figure> <figure><img src="/files/AMvJLeQ1UqASwFtsxYcw" alt=""><figcaption></figcaption></figure></div>

Escribimos los cambios

<figure><img src="/files/Bckbl7LoKuwMRMwbNKNf" alt=""><figcaption></figcaption></figure>

Inmediatamente despues empezara la instalacion normal del sistema.

<figure><img src="/files/aTmnYJMePTvYF2cE0nc5" alt=""><figcaption></figcaption></figure>

<div><figure><img src="/files/fJocT9gdEP3283CxwdOW" alt=""><figcaption></figcaption></figure> <figure><img src="/files/vy6HnZTFMu0hXqlMTosu" alt=""><figcaption></figcaption></figure></div>

<div><figure><img src="/files/EFh6bA04GU7gTrffXvOW" alt=""><figcaption></figcaption></figure> <figure><img src="/files/g3WVJVMM3OlI6iWnEBoY" alt=""><figcaption></figcaption></figure></div>

<div><figure><img src="/files/eTgCIc9u31NI7YtJ1X21" alt=""><figcaption></figcaption></figure> <figure><img src="/files/9BQik9pyR3U6t0ISUuBv" alt=""><figcaption></figcaption></figure></div>

<div><figure><img src="/files/KAJTcJBAUYvjUQ9RNhCn" alt=""><figcaption></figcaption></figure> <figure><img src="/files/fi5ekdGNyVR1UyYGoGMt" alt=""><figcaption></figcaption></figure></div>

Instalacion del grub

<div><figure><img src="/files/YCmhfbcJ5lHzqbbUzmFD" alt=""><figcaption></figcaption></figure> <figure><img src="/files/kNRiOj1BBlyb8sPWvNZp" alt=""><figcaption></figcaption></figure></div>

Finalizando la instalación

<div><figure><img src="/files/zGKWXdNB3izBN7v9JLt5" alt=""><figcaption></figcaption></figure> <figure><img src="/files/yRSQrbG9JPzHZrNZUnaa" alt=""><figcaption></figcaption></figure></div>

Reiniciamos, ya tenemos el sistema instalado 🎉

<figure><img src="/files/5LJ915AxORuhhxMiguGR" alt=""><figcaption></figcaption></figure>

Al inciar, nos pedira la password que hemos establecido al configurar el volumen cifrado para seguir con el arranque del sistema.

<figure><img src="/files/2ylGBHFncEEI45sNDPFw" alt=""><figcaption></figcaption></figure>

Si va todo bien, arrancara el sistema normalmente.

<div><figure><img src="/files/k3hfHCrTUYbtQUBG3Myn" alt=""><figcaption></figcaption></figure> <figure><img src="/files/rbhuYKrEdVN37oUdT6EY" alt=""><figcaption></figcaption></figure></div>

detalle de como quedan las particiones creadas.

<figure><img src="/files/vqKMvc1FWmVOnVMEe5KV" alt=""><figcaption></figcaption></figure>

Y esto es todo, ya tienes tu Debian con la particion raiz y /home cifradas con LUKS, muy recomendable en cualquier equipo que se use hoy en dia, pero mas aun si es un equipo portatil.

<figure><img src="/files/c8V2aqmPBMVpbvwlDenl" alt="" width="51"><figcaption></figcaption></figure>


# High-Res Audio 192 kHz en Debian 13: Sound Blaster Z

<figure><img src="/files/8c4ujp0pYFWG7Esqbm9N" alt="" width="375"><figcaption></figcaption></figure>

\
Lo primero es instalar el firmware

Descargamos el .bin desde aqui: <https://packages.debian.org/file%3Actefx-desktop.bin>\
o desde aquí si falla el anterior: <https://mega.nz/file/hcQVDDJL#B3QkvwyUkHSDwN-7C9tKndipYyuGQioQMO64oyvCEEU>

Lo copiamos a:

```bash
sudo cp -rf ctefx-desktop.bin /usr/lib/firmware/
```

**Instalamos el paquete no libre del firmware**

```bash
sudo apt install -y firmware-linux-nonfree
```

#### Verificamos el hardware

* El sistema debe reconocer nuestra tarjeta de sonido

```bash
aplay -l
```

output:

```bash
$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: Creative [HDA Creative], device 0: CA0132 Analog [CA0132 Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: Creative [HDA Creative], device 1: CA0132 Digital [CA0132 Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
```

\
Confirmar que PipeWire detecta correctamente la tarjeta

```bash
pw-cli list-objects | grep -i 'sound blaster'
```

output:

```bash
$ pw-cli list-objects | grep -i 'sound blaster'
 		device.description = "CA0132 Sound Core3D [Sound Blaster Recon3D / Z-Series / Sound BlasterX AE-5 Plus] (SB1570 SB Audigy Fx)"
 		node.description = "CA0132 Sound Core3D [Sound Blaster Recon3D / Z-Series / Sound BlasterX AE-5 Plus] (SB1570 SB Audigy Fx) Estéreo analógico"
 		node.description = "CA0132 Sound Core3D [Sound Blaster Recon3D / Z-Series / Sound BlasterX AE-5 Plus] (SB1570 SB Audigy Fx) Estéreo analógico"
```

\
Muestra los sinks PipeWire activos

* Inicialmente puede aparecer a 48 kHz (default)

```bash
pactl list short sinks
```

output:

```bash
$ pactl list short sinks
	  alsa_output.pci-0000_06_00.0.analog-stereo	PipeWire	s32le 2ch 48000Hz	SUSPENDED
	  alsa_output.pci-0000_0d_00.1.hdmi-stereo	PipeWire	s32le 2ch 48000Hz	SUSPENDED
```

Llegados a este punto, Debian 13, reconoce perfectamente la tarjeta de sonido Sound Blaster Z.\
✅ 🎉

Se puede apreciar que:

* PipeWire la está usando como `alsa_output.pci-0000_06_00.0.analog-stereo`
* Actualmente está en **s32le 2ch 48000Hz** (32-bit, 48 kHz), **no en 192 kHz** ⚠️

{% hint style="info" %}
Debian 13, PipeWire usa `wireplumber` como session manager
{% endhint %}

#### Configuración de PipeWire

Su función es **definir las propiedades globales del motor de audio**, en concreto **el reloj por defecto** que PipeWire utilizará al crear nuevos nodos.

```bash
mkdir -p ~/.config/pipewire/pipewire.conf.d
vim ~/.config/pipewire/pipewire.conf.d/90-clock-rate.conf
```

contenido:

```bash
context.properties = {
    default.clock.rate          = 192000
    default.clock.allowed-rates = [ 44100 48000 96000 192000 ]
}
```

{% hint style="info" %}
Esto fuerza que PipeWire permita hasta 192 kHz y **desactiva resampling automático**.
{% endhint %}

Si tu tarjeta es [compatible](#ver-formatos-soportados-por-el-dac) con **24bit**,añadiremos el formato `S24LE`

```bash
context.properties = {
    default.clock.rate          = 192000
    default.clock.allowed-rates = [ 44100 48000 96000 192000 ]
    default.audio.format        = "S24LE"
}
```

#### Configuración de WirePlumber

Su función es **definir políticas** para cómo WirePlumber debe gestionar **una tarjeta de sonido concreta.**

```bash
mkdir -p ~/.config/wireplumber/wireplumber.conf.d
vim ~/.config/wireplumber/wireplumber.conf.d/60-soundblaster-192khz.conf
```

contenido:

```bash
monitor.alsa.rules = [
  {
    matches = [
      {
        device.name = "alsa_card.pci-0000_06_00.0"
      }
    ]
    actions = {
      update-props = {
        audio.format = "S32LE"
        audio.rate = 192000
        audio.channels = 2
        api.alsa.period-size = 1024
        api.alsa.headroom = 0
        session.suspend-timeout-seconds = 0
      }
    }
  }
]
```

* `device.name` coincide **exactamente** con:

  ```bash
  alsa_output.pci-0000_06_00.0.analog-stereo
  ```
* Se fuerza:
  * **S32LE** (formato que *sí* soporta el CA0132)
  * **192 kHz**
  * **2 canales**
* Se evita suspensión del sink
* No hay resampling interno si la app usa 192 kHz

#### Reinicio de servicios

```bash
systemctl --user restart pipewire pipewire-pulse wireplumber
```

#### Verificación final

```bash
pactl list short sinks
```

output:

```bash
$ pactl list short sinks
    alsa_output.pci-0000_06_00.0.analog-stereo PipeWire s32le 2ch 192000Hz SUSPENDED
    alsa_output.pci-0000_0d_00.1.hdmi-stereo PipeWire s32le 2ch 48000Hz SUSPENDED
```

* Analog-stereo (Sound Blaster Z) → **192 kHz** ✅ 🔊
* HDMI (GPU) → 48 kHz ❌

Esto es **normal** y esperado: el override solo apuntaba a **hw:0 / analog-stereo**, por eso PipeWire fuerza 192 kHz en esa tarjeta. La salida HDMI (hw:1) no tiene configuración especial, así que se queda en 48 kHz, que es la frecuencia por defecto de PipeWire para sinks no configurados.

#### Ver formatos soportados por el DAC

* Confirma que ALSA soporta realmente **192 kHz** y **S32\_LE**

```bash
aplay -D hw:0,0 --dump-hw-params /dev/zero
```

output:

```bash
$ aplay -D hw:0,0 --dump-hw-params /dev/zero
Playing raw data '/dev/zero' : Unsigned 8 bit, Rate 8000 Hz, Mono
HW Params of device "hw:0,0":
--------------------
ACCESS:  MMAP_INTERLEAVED RW_INTERLEAVED
FORMAT:  S16_LE S32_LE
SUBFORMAT:  STD MSBITS_MAX
SAMPLE_BITS: [16 32]
FRAME_BITS: [32 192]
CHANNELS: [2 6]
RATE: [16000 192000]
PERIOD_TIME: (31 16384000]
PERIOD_SIZE: [6 262144]
PERIOD_BYTES: [128 2097152]
PERIODS: [2 32]
BUFFER_TIME: (62 32768000]
BUFFER_SIZE: [12 524288]
BUFFER_BYTES: [128 2097152]
TICK_TIME: ALL
--------------------
aplay: set_params:1387: Sample format non available
Available formats:
- S16_LE
- S32_LE
```

\
Resumen de esa salida:

**Formatos soportados por el DAC (hardware real)**

```bash
FORMAT:  S16_LE S32_LE
SAMPLE_BITS: [16 32]
```

El CA0132 **NO soporta**:

* `S24_LE`
* `S24_3LE` (24-bit packed en 3 bytes)

Solo admite:

* **16 bits**
* **32 bits**

**Frecuencias soportadas**

```bash
RATE: [16000 192000]
```

✅ El DAC **sí soporta 192 kHz nativos**.\
No hay emulación ni limitación por driver.

**Canales**

```bash
CHANNELS: [2 6]
```

Soporta:

* Estéreo (2)
* Multicanal (5.1) 🔊


# Después de Instalar Debian 12

<figure><img src="/files/TK3dy1fS30Le3yXAD8d5" alt="" width="375"><figcaption></figcaption></figure>

Nos bajamos la ISO de la web oficial de debian podéis elegir la versión stable o testing. Personalmente me quedo con la stable y luego le añado los repositorios.\
\
Grabamos la ISO y comenzamos la instalación.

<figure><img src="/files/p0i7WS5Gng4cMbRHBJ8b" alt=""><figcaption></figcaption></figure>

Lo primero que vemos es que no tenemos sudo!!!

Habilitamos sudo hacemos login con root

```sh
su - root
```

Ahora habilitamos nuestro usuario con permisos de sudo

```sh
usermod -aG sudo $USER
```

y después reiniciamos el sistema.

<figure><img src="/files/5uS2gGSCXx8VtA2fTRPA" alt="" width="138"><figcaption></figcaption></figure>

Después de reiniciar ya tenemos nuestro sudo.

Agregamos los repositorios `non-free` y `backports`

```sh
# Repos oficiales no libres
deb https://ftp.debian.org/debian/ bookworm contrib main non-free non-free-firmware
# deb-src https://ftp.debian.org/debian/ bookworm contrib main non-free non-free-firmware

# Actualizaciones
deb https://ftp.debian.org/debian/ bookworm-updates contrib main non-free non-free-firmware
# deb-src https://ftp.debian.org/debian/ bookworm-updates contrib main non-free non-free-firmware
deb https://ftp.debian.org/debian/ bookworm-proposed-updates contrib main non-free non-free-firmware
# deb-src https://ftp.debian.org/debian/ bookworm-proposed-updates contrib main non-free non-free-firmware

# Seguridad
deb https://security.debian.org/debian-security/ bookworm-security contrib main non-free non-free-firmware
# deb-src https://security.debian.org/debian-security/ bookworm-security contrib main non-free non-free-firmware

# Repositorios Backports
deb https://ftp.debian.org/debian/ bookworm-backports contrib main non-free non-free-firmware
# deb-src https://ftp.debian.org/debian/ bookworm-backports contrib main non-free non-free-firmware

# Multimedia
deb https://www.deb-multimedia.org bookworm main non-free
```

\
Agregamos las claves gpg

```sh
apt-key adv --keyserver keyring.debian.org --recv-keys 5C808C2B65558117
apt-key export 65558117 | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/debian-multimedia.gpg
```

\
Y actualizamos el repositorio y el sistema

<pre class="language-sh"><code class="lang-sh"><strong>sudo apt update &#x26;&#x26; sudo apt upgrade -y
</strong></code></pre>

{% hint style="info" %}
Si hemos tenido muchas actualizaciones, sobre todo alguna del kernel, recomendable reiniciar el sistema.
{% endhint %}

\
Instalación de paquetes, esta es mi selección de paquetes que tengo instalados, incluye desde librerías, programas variados, herramientas de desarrollo...

```sh
sudo apt install build-essential dkms make cmake linux-headers-$(uname -r) bc bison flex rsync amd64-microcode firmware-amd-graphics firmware-linux firmware-linux-free firmware-linux-nonfree firmware-misc-nonfree util-linux cifs-utils libfuse2 sysfsutils zlib1g-dev libbz2-dev libreadline-dev iperf3 libiperf0 apt-transport-https ca-certificates software-properties-common dirmngr gnupg openssl libssl-dev sshfs libgbm1 libgjs0g libsqlite3-dev jq libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev libelf-dev pkg-config brasero cdrdao dvdauthor -y
```

y esta es mi selección que se instala desde el repositorio backports

```sh
sudo apt install -t bookworm-backports h264enc vulkan-tools vulkan-validationlayers mesa-utils mesa-utils-bin mesa-utils-extra mesa-va-drivers mesa-vdpau-drivers mesa-vulkan-drivers mesa-opencl-icd libva2 vainfo libgl1-mesa-dri libglapi-mesa libglx-mesa0 libegl-mesa0 duf vim git curl wget nmap nvme-cli dexdump lm-sensors htop vlc libaacs0 libaacs-dev lame libbluray2 ffmpeg neofetch flac gparted meld filezilla keepassxc gimp gimp-help-es gimp-data-extras v4l-utils libdvd-pkg libdvdread8 libavcodec59 papirus-icon-theme arc-theme python3 python3-pip python3-pil python3-pil.imagetk bpytop python3-psutil libglib2.0-dev-bin gir1.2-gtk-4.0 gjs libgtk-4-1 libgtk-4-bin libgtk-4-common libxatracker2 ttf-mscorefonts-installer gir1.2-gtop-2.0 p7zip-full rar unrar zip unzip bzip2 gnome-shell-extension-manager gnome-maps gnome-weather h264enc -y
```

{% hint style="info" %}
Para la instalación de paquetes de un repositorio concreto, añadimos -t y el repo

`sudo apt install -t bookworm-backports nombre_del_paquete`
{% endhint %}

\
Claves para películas en DVD

```sh
sudo dpkg-reconfigure libdvd-pkg
sudo apt install libdvdcss-dev libdvdcss2 -y
```

\
Configuración de `lm-sensors`

```sh
yes "" | sudo sensors-detect
```

Herramientas de red

```bash
sudo apt install ethtool iperf3 nmap -y
```

\
TPM2.0 Tools

```bash
sudo apt install tpm2-abrmd tpm2-tools -y
```

\
Oracle Java JDK

```sh
wget -c https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.tar.gz
tar -zxvf jdk-21_linux-x64_bin.tar.gz
cd jdk-21_linux-x64_bin
sudo mv jdk-21.0.6 /usr/lib/jvm/
sudo ln -s /usr/lib/jvm/jdk-21.0.6 /usr/lib/jvm/default-java
sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/default-java/bin/javac" 1
sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/default-java/bin/java" 1

echo "export JAVA_HOME=/usr/lib/jvm/default-java" >> ~/.bashrc
source ~/.bashrc

$ java -version
"21.0.6" 2025-01-21 LTS
Java(TM) SE Runtime Environment (build 21.0.6+8-LTS-188)
Java HotSpot(TM) 64-Bit Server VM (build 21.0.6+8-LTS-188, mixed mode, sharing)
```

\
Google Chrome

```sh
curl -fSsL https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor | sudo tee /usr/share/keyrings/google-chrome.gpg >> /dev/null
echo deb [arch=amd64 signed-by=/usr/share/keyrings/google-chrome.gpg] http://dl.google.com/linux/chrome/deb/ stable main | sudo tee /etc/apt/sources.list.d/google-chrome.list
sudo apt update && sudo apt install -y google-chrome-stable
```

\
VirtualBox 7.1

```sh
echo deb [arch=amd64] https://download.virtualbox.org/virtualbox/debian bookworm contrib | sudo tee /etc/apt/sources.list.d/virtualbox.list
wget -O- https://www.virtualbox.org/download/oracle_vbox_2016.asc | sudo apt-key add -
apt-key export 2980AECF | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/virtualbox.gpg
sudo apt update && sudo apt install -y virtualbox-7.1
sudo usermod -a -G vboxusers $USER
```

\
Visual Studio Code

```sh
curl -fSsL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor | sudo tee /usr/share/keyrings/vscode.gpg >/dev/null
echo deb [arch=amd64 signed-by=/usr/share/keyrings/vscode.gpg] https://packages.microsoft.com/repos/vscode stable main | sudo tee /etc/apt/sources.list.d/visual-studio.list
sudo apt update && sudo apt install -y code
```

\
Kubectl

```sh
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod a+x kubectl
sudo mv kubectl /usr/bin/
```

\
Thunderbird, cliente de correo

```sh
sudo apt install thunderbird thunderbird-l10n-es-es -y
```

\
Eliminar juegos Gnome

```sh
sudo apt purge --autoremove gnome-games gpac zutty -y
```

\
Azure Cli

```sh
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
```

\
Pyenv

```sh
curl https://pyenv.run | bash
echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
```

\
Firewall

```sh
sudo apt install ufw -y
sudo ufw enable
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw status verbose
sudo apt install gufw
```

\
Wireguard

```bash
sudo apt install wireguard -y
```

\
OBS Studio

```sh
sudo apt install ffmpeg obs-studio -y
```

\
OpenVPN

```sh
sudo apt install network-manager-openvpn-gnome openvpn-systemd-resolved -y
```

\
Habilitamos el servicio de TRIM

```sh
sudo systemctl enable fstrim.timer
sudo systemctl start fstrim.timer
```

\
Habilitar la escala fraccionada del monitor en los ajustes de Gnome, si tienes un monitor 4K lo vas agradecer.

<figure><img src="/files/TlGflsbt11i6OPGvfj4d" alt="" width="375"><figcaption></figcaption></figure>

```sh
gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer']"
gsettings set org.gnome.mutter center-new-windows true
```

\
Me faltarían algunas aplicacion que se instalan por .deb, como rpi-imager, cambiar firefox ESR por la version actual disponible, thunderbird (estas 2 ultimas, las instalo desde .tar.gz y luego creo un .desktop para añadir al `/home/$USER/.local/share/applications` para que se muestren en el menu de las aplicaciones, ya tengo tema para otra entrada! :smile:)

<figure><img src="/files/XqJNou7Nf1s6wddc4cqk" alt=""><figcaption></figcaption></figure>


# Después de instalar Fedora 38

Ya tenemos el sistema instalado, lo primero es actualizar los posibles paquetes.

```sh
sudo dnf update -y
```

Si hemos actualizado paquetes y kernel, que seguramente así sea, reiniciamos.<br>

Instalamos las herramientas de desarrollo

```sh
sudo dnf install @development-tools
```

Cabeceras del kernel y el modulo dkms

```sh
sudo dnf install kernel-headers kernel-devel dkms coreutils
```

**Java OpenJDK**

```sh
sudo dnf install java-11-openjdk.x86_64
```

Si tu GPU es AMD, después de esto, reiniciamos.

```sh
sudo dnf install xorg-x11-drv-amdgpu mesa-va-drivers mesa-vdpau-drivers vulkan-tools
```

**Multimedia**

```sh
sudo dnf install h264enc vlc python-vlc libaacs libbluray lame flac libdvdread transmission
```

**Utilidades**

```sh
sudo dnf install neovim git gparted vim meld cifs-utils bash-completion util-linux nmap wget curl sed tar unzip yad bzip2-devel gcc-c++ glib2 libpng libxml2 freetype ncurses-devel bison flex elfutils-libelf-devel openssl-devel
```

**LM Sensors**

```sh
sudo dnf install lm_sensors
```

Luego lo configuramos

```sh
yes "" | sudo sensors-detect
```

**Gestor de contraseñas KeePass**

```sh
sudo dnf install keepassxc
```

**MEGA**

```sh
sudo dnf install https://mega.nz/linux/repo/Fedora_38/x86_64/megasync-4.9.1-1.1.x86_64.rpm
```

```sh
sudo dnf install https://mega.nz/linux/repo/Fedora_38/x86_64/nautilus-megasync-5.1.0-1.1.x86_64.rpm
```

**VirtualBox 7**

Creamos un fichero en

```sh
sudo vim /etc/yum.repos.d/virtualbox.repo
```

Y añadimos:

```sh
[virtualbox]
name=Fedora $releasever - $basearch - VirtualBox
baseurl=http://download.virtualbox.org/virtualbox/rpm/fedora/$releasever/$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://www.virtualbox.org/download/oracle_vbox_2016.asc
```

Instalamos el paquete

```sh
sudo dnf install VirtualBox-7.0
```

y finalmente damos permisos a nuestro usuario

```sh
sudo usermod -a -G vboxusers $USER
sudo usermod -a -G dialout $USER
```

**Python 3**

```sh
sudo dnf install python3 python3-pip python3-pillow python3-pillow-tk
```

**Gimp**

```sh
sudo dnf install gimp gimp-help-es gimp-data-extras
```

**Kubectl**

Creamos un fichero en

```sh
sudo vim /etc/yum.repos.d/kubernetes.repo
```

Y añadimos:

```sh
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
```

finalmente, instalamos el paquete

```sh
sudo dnf install kubectl
```

Limpiar la cache

```sh
sudo dnf clean dbcache
```

```sh
sudo dnf clean all
```


# Instalar fuentes OTF y TTF en Linux

<figure><img src="/files/iTfFzYMDSVb7cWOWLdlg" alt="" width="563"><figcaption></figcaption></figure>

Instalacion de las fuentes San Francisco de Apple, el formato de las fuentes es .otf y un .ttf, podemos o bien ir a la web de apple developers y descargar los .dmg que contienen las fuentes (si tenemos un Mac) o hacerlo por git...

{% hint style="info" %}
Este tutorial es valido para otras fuentes .otf y .ttf
{% endhint %}

Descargamos el pack de fuentes

```sh
git clone https://github.com/sahibjotsaggu/San-Francisco-Pro-Fonts.git && cd San-Francisco-Pro-Fonts
```

\
Con las fuentes en nuestro equipo, ahora creamos 2 directorios

```sh
sudo mkdir /usr/share/fonts/opentype/apple
sudo mkdir /usr/share/fonts/truetype/apple
```

\
Ahora copiamos las fuentes .otf

```sh
sudo cp -rf *.otf /usr/share/fonts/opentype/apple/
```

\
Y ahora las fuentes .ttf

```sh
sudo cp -rf *.ttf /usr/share/fonts/truetype/apple/
```

\
Cambiamos los permisos a las fuentes

<pre class="language-sh"><code class="lang-sh"><strong>sudo chmod 644 /usr/share/fonts/opentype/apple/*.otf
</strong><strong>sudo chmod 644 /usr/share/fonts/truetype/apple/*.ttf
</strong></code></pre>

\
Ahora tenemos que actualizar la cache del sistema

```sh
sudo fc-cache -f -v
```

Ya podemos tenemos disponible las fuentes para cambiarlas, y reiniciar el sistema.

<figure><img src="/files/f38kFuHDgub5i0hgqJKY" alt="" width="563"><figcaption></figcaption></figure>


# Instalar GNU/Linux Debian 12, en Macbook Pro (late 2015) A1502

La ultima version disponilbe para este equipo es MacOS Monterey, con lo que aun teniendo hardware para seguir dandole vida, Apple ya lo ha jubilado, pero le podemos dar otra vida con GNU/Linux

{% hint style="warning" %}
Antes de formatear, asegurate de tener una copia MacOS por si decides volver
{% endhint %}

<figure><img src="/files/D6lcp9fGF4iZknrnDanO" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/BwsL6vxIMGzbBhg75Qh5" alt="" width="525"><figcaption></figcaption></figure>

La instalacion se hace normalmente, lo unico que debes pulsar la tecla "Alt" antes de que aparezca la manzana, para que te muestre el menu de arranque, asi puedes elegir el USB/CD/DVD donde tengas grabada la ISO de Debian.

<figure><img src="/files/ZC98pVo6NqmolSuXOPb2" alt="" width="335"><figcaption></figcaption></figure>

{% hint style="info" %}
Este tutorial es para Debian 12.1.0, pero puedes instalar cualquier otra distribución
{% endhint %}

y realizamos la instalacion normalmente, aunque el trackpad NO FUNCIONA en la instalacion, conecta un raton USB

Se ve todo muy pequeño, debido a la resolucion de la pantalla retina, no te preocupes que cuando termine se ve bien, de lujo ademas!

<figure><img src="/files/aQy2wfsHA6qf2lfaHkhz" alt="" width="563"><figcaption></figcaption></figure>

Cuando termine de instalar, aun nos queda un poco de trabajo que hacer, para tenerlo listo.

<figure><img src="/files/8iT0VFM4owxchaey1VMm" alt="" width="563"><figcaption></figcaption></figure>

Bien, con Debian instalado, lo priemero es habilitar el sudo para nuestro usuario.

```sh
su - root
```

```sh
usermod -aG sudo $USER
```

y reiniciamos el macbook

Tenemos que instalar unos paquetes...

```sh
sudo apt update && sudo apt install build-essential dkms make cmake linux-headers-$(uname -r) intel-microcode firmware-linux-nonfree util-linux firmware-brcm80211 git kmod libssl-dev checkinstall -y
```

y reiniciamos de nuevo.

Ahora debemos descargarnos un fichero y copiarlo en `/lib/firmware/brcm`

```sh
wget https://gist.githubusercontent.com/MikeRatcliffe/9614c16a8ea09731a9d5e91685bd8c80/raw/38180b6a0ce552e1a3a2826ffea2bf1f52d05e9f/brcmfmac43602-pcie.txt
```

Editamos el fichero con un editor de texto y sustituimos la linea

```console
macaddr=xx:xx:xx:xx:xx:xx
```

con la MAC de tu wifi, guardamos el fichero ya editado, y lo copiamos a

```sh
sudo cp -rf brcmfmac43602-pcie.txt /lib/firmware/brcm/
```

Ahora aplicamos un parche para suspension.

```sh
sudo vim /lib/systemd/system-sleep/lid_wakeup_disable
```

```sh
#!/bin/sh

# /lib/systemd/system-sleep/lid_wakeup_disable
#
# Avoids that system wakes up immediately after suspend or hibernate
# with lid open (e.g. suspend/hibernate through KDE menu entry)
#
# Tested on MacBookPro12,1

case $1 in
  pre)
    if cat /proc/acpi/wakeup | grep -qE '^LID0.*enabled'; then
        echo LID0 > /proc/acpi/wakeup
    fi
    ;;
esac
```

le damos permisos de ejecución

```sh
sudo chmod a+x /lib/systemd/system-sleep/lid_wakeup_disable
```

Otro script para levantar la wifi despues de una suspensión

```sh
sudo vim /usr/lib/systemd/system-sleep/network_hack_hibernation
```

```sh
#!/bin/sh

# /usr/lib/systemd/system-sleep/network_hack_hibernation
#
# Restores network controller functionality after wakeup from
# hibernation
#
# Tested on MacBookPro12,1
# BCM43602 WiFi network controller

if [ "$2" = "hibernate" ]; then
    case "$1" in
        pre)
            if lsmod | grep -q brcmfmac; then
                rmmod brcmfmac
            fi
            ;;
        post)
            modprobe brcmfmac
            ;;
    esac
fi
```

le damos permisos de ejecución

```sh
sudo chmod a+x /lib/systemd/system-sleep/network_hack_hibernation
```

y reiniciamos

\
😁

<figure><img src="/files/30J1IzfllaYo16d04jO6" alt=""><figcaption></figcaption></figure>

<br>

cámara iSight

{% hint style="info" %}
Que funcione o no la camara es casi una loteria
{% endhint %}

```sh
git clone https://github.com/patjak/facetimehd-firmware.git && cd facetimehd-firmware
```

```sh
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0-only
# Script para instalar cámara FaceTime HD en MacBook Pro A1502

set -e

echo "🚀 Instalando cámara FaceTime HD"

# 1️⃣ Instalar dependencias necesarias
echo "📦 Instalando paquetes necesarios..."
sudo apt update
sudo apt install -y git build-essential linux-headers-$(uname -r) curl xz-utils cpio v4l-utils dkms

# 2️⃣ Descargar e instalar firmware
echo "💾 Descargando y extrayendo firmware FaceTimeHD..."
TMP_DIR=$(mktemp -d)
cd "$TMP_DIR"

git clone https://github.com/patjak/facetimehd-firmware.git
cd facetimehd-firmware

sudo ./facetimehd-firmware-install.sh

echo "✅ Firmware instalado correctamente."

# 3️⃣ Compilar e instalar driver bcwc_pcie
echo "🔧 Clonando y compilando driver bcwc_pcie..."
cd "$TMP_DIR"
git clone https://github.com/patjak/bcwc_pcie.git
cd bcwc_pcie

make
sudo make install

# 4️⃣ Cargar módulo del kernel
echo "🛠️ Cargando módulo del kernel..."
sudo depmod
sudo modprobe facetimehd

# 5️⃣ Comprobar que la cámara se detecta
echo "🔎 Comprobando la cámara..."
if v4l2-ctl --list-devices | grep -i facetime; then
    echo "🎉 Cámara FaceTime HD detectada correctamente!"
    echo "Dispositivo disponible en /dev/video*"
else
    echo "⚠️ La cámara no se detecta. Verifica los logs con 'dmesg | grep -i facetimehd'"
fi

# 6️⃣ Limpieza
echo "🧹 Limpiando archivos temporales..."
rm -rf "$TMP_DIR"

echo "✅ Instalación completada. Reinicia el sistema."

```

Despues del reinicio, probar alguna aplicacion, Cheese, o Telegram mismamente para ver si es detectada y funcional.


# Clonar disco a NAS con CloneZilla

Como clonar un disco duro/ssd/nvme a un NAS por medio de samba

<figure><img src="/files/R1nWAhxTC76vn2mVRMO9" alt="" width="375"><figcaption></figcaption></figure>

Lo primero, tenemos que crear un USB o CD, con CloneZilla, nos descargamos la ISO\
<https://clonezilla.org/downloads/download.php?branch=alternative> ( ⚠️ elegir ISO)

Ya teniendo el USB/CD creado con CloneZilla, arrancamos el equipo con el.

<figure><img src="/files/JTYHO844BrjzQE8yt6Qc" alt="" width="563"><figcaption></figcaption></figure>

Configuramos el idioma y el idioma del teclado

![](/files/HBvY7xfadAB6JABQIbgv) ![](/files/LyUbE8afIqh1YZMjXOPT) ![](/files/eMo3WR5X8iwMubiUYJbZ) ![](/files/vxWEscsipFu3NwZJrq8R)

Comenzamos

<figure><img src="/files/ourSNx0mbYSvGzdqWKbQ" alt="" width="563"><figcaption></figcaption></figure>

Elegiremos la primera opción "**device-image**", ya que vamos a clonar nuestro disco a una imagen

<figure><img src="/files/0yZasDQu2AlpUfAxMnit" alt="" width="563"><figcaption></figcaption></figure>

Aquí, como vamos a clonar el disco a nuestro NAS, elegiremos el tipo de conexion, en mi caso "**samba\_server**", si prefieres hacerlo a un disco externo por USB, elije la primera opción.

<figure><img src="/files/gzYrfSjWrYbjpqcjW57M" alt="" width="563"><figcaption></figcaption></figure>

Configuramos el metodo de conexion de red de la maquina donde tenemos el disco que queremos clonar.

<figure><img src="/files/g0CATbcsvNqKyPI4Wx0z" alt="" width="563"><figcaption></figcaption></figure>

Y aquí, configuramos la IP de nuestro NAS, la ruta donde vamos a guardar la imagen y el protocolo samba que vamos a usar. (si no lo conoces, déjalo en auto)

![](/files/vK7ZP7J9N3PYj9HeST7Y) ![](/files/VBiYzBgM45vViBQUejiL) ![](/files/avTVkZlk44tEVfwPk7pF)

La parte de seguridad por defecto en auto. Después nos pedirá nuestra password del NAS para montar el volumen.

![](/files/FUbLM9XEpnpRWWjVGEkK) ![](/files/ckpvAkNQVGtRCmSrolvi)

La siguiente opción, déjalo por defecto.

<div align="center"><figure><img src="/files/zFftspXo0SyGrYeYMgTl" alt="" width="375"><figcaption></figcaption></figure></div>

{% hint style="info" %}
En caso de tener que restaurar, es este punto donde cambia para poder restaurar nuestra imagen a disco.
{% endhint %}

Aquí le indicamos que queremos clonar, si queremos hacer una copia del disco, completamente elegiremos la primera opción "**savedisk**", si por el contrario queremos guardar las particiones, elegiremos la segunda opción "**saveparts**", en caso de tener que restaurar un disco, realizaremos los pasos anteriores hasta el momento, y aquí seleccionaríamos "**restoredisk**" o "**restoreparts**" según hayamos elegido en el momento de clonar.\
\
En este caso, "**savedisk**" ya que queremos hacer una clonación completa del disco

<figure><img src="/files/ywbhcG0RJCuwFdsU7gDW" alt=""><figcaption></figcaption></figure>

Aquí le indicamos el nombre de la imagen que vamos a crear a partir de nuestro disco.\
( en caso de tener que restaurar, nos mostraria una lista de las imagenes que tengamos y seleccionariamos la que queramos)

<figure><img src="/files/dae2j1ZsVdViKIBgxFfa" alt="" width="563"><figcaption></figcaption></figure>

En este punto, nos lista los discos disponibles que tenemos en nuestro equipo, seleccionamos el que vamos a clonar a una imagen.

<figure><img src="/files/L0LQUcnNoR7rTYvQfN08" alt="" width="563"><figcaption></figcaption></figure>

El metodo de compresión de la imagen, lo dejaremos en `-z1p`.

<figure><img src="/files/05WB2uQotd1RmENTTZoL" alt="" width="563"><figcaption></figcaption></figure>

Aquí, si hemos realizado un `fsck` antes de la clonación no hace falta, en caso contrario, selecciona la 2ª opcion "`fsck -y`"

<figure><img src="/files/bgz4eVxEotXacOSrHZ3I" alt="" width="563"><figcaption></figcaption></figure>

En esta parte, seleccionamos que SI, queremos una imagen que podamos restaurar en caso necesario, si no de que queremos la imagen? Esto comprueba que la imagen creada es valida para restaurarla, si al crearla diera error, nos tocaría volver a crearla de nuevo.

<figure><img src="/files/J8rHz2rQZPazvxDGVcVT" alt="" width="563"><figcaption></figcaption></figure>

Cifrado de la imagen. Esto es al gusto de cada uno, personalmente siempre prefiero cifrarlas.

{% hint style="warning" %}
Si disco esta cifrado con LUKS, no cifres la imagen, ya que da problemas a la hora de restaurar el disco.
{% endhint %}

<figure><img src="/files/F4vmoNzX1EN0m4K9EhUk" alt="" width="563"><figcaption></figcaption></figure>

Esta parte es que quieres que haga el sistema cuando acabe de crear la imagen, lo dejamos por defecto.

<figure><img src="/files/xJ7hlvt9J3WFQSlSoJHI" alt="" width="563"><figcaption></figcaption></figure>

Y listo! Hace una comprobacion y nos saca un informe como este y nos pregunta que si queremos proceder, le decimos que si "Y"

<figure><img src="/files/n6GViJfOAfLdIxcOct1w" alt=""><figcaption></figcaption></figure>

y comienza a clonar... Aqui dependiendo de la velocidad de lectura de tu disco a clonar, tu red, tu velocidad del NAS, tardara mas o menos, en mi caso unos 7 minutos aprox en clonar un SSD de 1Tb al NAS por red gigabit, ten en cuenta que no clona los espacios vacíos, solo clona la parte de datos y ademas la comprime, en mi caso la suma total de todas las particiones rondaba los 90GB y comprimidos apenas eran 6Gb el tamaño final de la imagen.

<figure><img src="/files/Hm7QzTjiv1MpLZcuo7Gb" alt="" width="563"><figcaption></figcaption></figure>

Cuando termine, verificara que las imagenes son restaurables, si no ha dado ningun error, nos mostrara una ventana asi.

<figure><img src="/files/xlYuwG9htsi8fW8w9v2L" alt="" width="563"><figcaption></figcaption></figure>

Y listo!

<figure><img src="/files/g3C1DQ6XQCht0OBz4vB6" alt="" width="563"><figcaption></figcaption></figure>

Detalle de la imagen clonada de Debian 12, cifrado con LUKS.

<figure><img src="/files/YPFVZeKs5el1gkOykHfr" alt="" width="452"><figcaption></figcaption></figure>


# Activar TRIM con systemd

![](/files/HpNgWvzl87FiRE5ehURn)

Instalamos el paquete necesario para poder habilitar TRIM en nuestro equipo

```bash
sudo apt install -y util-linux
```

Con el paquette ya instalado, ahora hablitamos el servicio para que se ejecute en cada arranque.

```bash
sudo systemctl enable fstrim.timer
```

Ahora podriamos reiniciar el equipo y ya tendriamos habilitado el servicio, o bien podemos forzarlo a mano.

```bash
sudo systemctl start fstrim.timer
```

Para conocer su estado, ejecutamos

```bash
sudo systemctl status fstrim.timer
```

Y nos devolvera algo como esto, que nos indica que el servicio ya esta corriendo

```bash
$ sudo systemctl status fstrim.timer

● fstrim.timer - Discard unused blocks once a week
     Loaded: loaded (/lib/systemd/system/fstrim.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Mon 2021-08-09 07:55:41 CEST; 4h 37min ago
    Trigger: Mon 2021-08-16 00:00:00 CEST; 6 days left
   Triggers: ● fstrim.service
       Docs: man:fstrim

ago 09 07:55:41 ryzen systemd[1]: Started Discard unused blocks once a week.
```

Ya tenemos el servicio corriendo, habilitado en el incio, pero ahora vamos a forzar el TRIM, sobre todo si no lo hemos realizado nunca o hemos modificado gran cantidad de datos los ultimos dias.\
\
Con este comando, lo que le decimos, es que queremos ejecutar ahora el trim para todas las particiones

```bash
sudo systemctl enable fstrim.timer --now
```

Tambien podemos hacerlo solo a una particion en concreto

```bash
sudo fstrim -v PARTICION
```

Ejemplo, en la particion /home

```bash
sudo fstrim -v /home
```

Si queremos cambiar la frecuencia con la se ejecuta el TRIM, editamos el fichero

```bash
sudo vim /etc/systemd/system/timers.target.wants/fstrim.timer
```

La estructura por defecto del fichero es la siguiente

```lua
[Unit]
Description=Discard unused blocks once a week
Documentation=man:fstrim
ConditionVirtualization=!container

[Timer]
OnCalendar=weekly
AccuracySec=1h
Persistent=true

[Install]
WantedBy=timers.target
```

Si deseamos aumentar o reducir la frecuencia, tendriamos que cambiar el parametro "OnCalendar", ahora se ejecuta 1 vez a la semana, podemos hacer que sea un dia concreto de la semana, diario...\
el parametro Persistent, indica que el momento que el equipo se encienda en caso de estar apagado, lo ejecute al encenderlo.

Si lo que queremos es consultar la ultima vez que se ha ejecutado el analisis...

```bash
sudo systemctl list-timers fstrim.timer --all
```

y para ver el log del resultado...

```bash
sudo journalctl -u fstrim.timer
```


# Error ata9 en dispositivo SATA

En kernel superior al 5.13, en ciertos dispositivos SATA como un SSD/HDD o una unidad óptica como un DVD o BluRay, nos da errores de este tipo:

```sh
[  176.012197] ata9: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
[  176.030125] ata9.00: configured for UDMA/133
[  186.473202] ata9.00: limiting speed to UDMA/100:PIO4
[  187.352274] ata9: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
[  187.386497] ata9.00: configured for UDMA/100
[  196.521329] ata9: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
[  196.531085] ata9.00: configured for UDMA/100
```

\
Para ello o bien usamos un kernel 5.13 o inferior (el 5.4 y 5.8, van estupendamente bien), o tocamos un parámetro en el sistema.\
\
Lo primero sera consultar que valor nos muestra esta salida:

```sh
cat /sys/class/scsi_host/host*/link_power_management_policy
```

si el valor NO es "`max_performance`", toca hacer el cambio.

Si lo que queremos es que el cambio sea temporal, basta con ejecutar esto:

```sh
sudo echo max_performance | sudo tee /sys/class/scsi_host/host*/link_power_management_policy
```

Podremos consultar en el `dmesg` si nos siguen apareciendo fallos después de ello.\
\
Si va todo correcto, podemos hacerlo permanente el cambio, de lo contrario en cuanto reiniciemos el cambio se pierde y volveremos a tener problemas.

Para fijarlo de forma permanente, lo primero entramos en el directorio

```sh
cd /etc/udev/rules.d/
```

Creamos un fichero:

```sh
vim 50-power-save.rules
```

Con el contenido:

```sh
ACTION=="add", SUBSYSTEM=="scsi_host", KERNEL=="host*", ATTR{link_power_management_policy}="max_performance"
```

y guardamos, podemos reiniciar la maquina para comprobar que ya no tenemos mas errores en el `dmesg` ni con el dispositivo.

Probado con kernel 6.2.0-20 en Ubuntu 23.04, y kernel 6.2.14-300 en Fedora 38 :ok\_hand:


# Dash to dock para Gnome

Si usas Gnome 4x, veras que no es visible el dock por defecto, pero se puede arreglar...\
\
Instala la extensión Dash to Dock desde Firefox, y nada mas. 😌

{% embed url="<https://extensions.gnome.org/extension/307/dash-to-dock/>" %}

<figure><img src="/files/CxvhmuI9wIaAUmfdFaki" alt=""><figcaption></figcaption></figure>

Y listo :smile:

<figure><img src="/files/q5HAWcnJVlwSyuIwabl7" alt=""><figcaption><p>Fedora 38</p></figcaption></figure>

<figure><img src="/files/dWc8EO8yewvabLXNDLCT" alt=""><figcaption><p>Debian 12</p></figcaption></figure>


# Solución al error AACS en VLC al reproducir un BluRay

Si intentamos reproducir una película en BluRay en el VLC, nos dará un error de AACS.\
\
Para solucionarlo.

```
sudo apt install libaacs-dev libbluray2 -y 
```

Después nos descargamos este fichero [aacs.tar.gz](https://mega.nz/file/5JZESQhY#3AyzoPFdgpdecBFiPuag9vUWM6wpcOJcZZO0LCbKy3Y) y lo descomprimimos en `/home/$USER/.config/`

Ahora abrimos el VLC y debería reproducir el BR sin problemas


# Gnome 42.5, en Linux Mint 21.1

Usando como base Linux Mint ([Vera](https://ftp.cixug.es/mint/stable/21.1/linuxmint-21.1-cinnamon-64bit.iso)) con escritorio Cinnamon, procederemos a instalar entorno GNOME 42

<figure><img src="/files/QhwxNOcK6AGb8kJIs4gv" alt=""><figcaption></figcaption></figure>

Lo primero de todo es tener actualizado el sistema

```shell
sudo apt update && sudo apt upgrade -y
```

\
Si esta el sistema actualizado continuamos, si no, reinicia primero.

Instalamos Gnome

Version minima

```sh
sudo apt install vanilla-gnome-desktop -y
```

O version completa, podemos instalar ambas

```sh
sudo apt install gnome -y
```

En un momento de la instalación, nos pedirá que gestor usar, nos dará 2 opciones, elegimos "**gdm3**", cuando termine reiniciamos el sistema.\
\
Una vez reiniciado, pulsamos en configuración abajo a la derecha, y elegimos "GNOME"

<figure><img src="/files/eazw3jxMzH6qYNTivtCv" alt=""><figcaption></figcaption></figure>

Y ya tenemos Gnome 42

<figure><img src="/files/8GpsFdwHNhR6668DDhcv" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/AgTidoXG9nrlDECSFbtm" alt=""><figcaption></figcaption></figure>

En el momento de escribir este post, van por la version 42.4

Instalar Tweaks e iconos Papirus

```shell
sudo apt install gnome-tweaks papirus-icon-theme -y
```

Después de todos los cambios, reiniciar y a disfrutar!

<figure><img src="/files/Y1CyScgc1EJ4XVsPcLbm" alt=""><figcaption></figcaption></figure>

Instalamos estas extensiones\
\
Esta es para tener una barra de tareas y que las aplicaciones que tengan su servicio en segundo plano podamos acceder a ellas, vease por ejemplo telegram.

{% embed url="<https://extensions.gnome.org/extension/615/appindicator-support/>" %}

Y esta es para monitorizar el hardware en la barra superior de gnome.

{% embed url="<https://extensions.gnome.org/extension/841/freon/>" %}


# dmesg: Initramfs unpacking failed: Decoding failed

Si vemos el mensaje

```shell
$ sudo dmesg
[ 0.593929] Initramfs unpacking failed: Decoding failed
```

\
Editamos el ficheros

```shell
/etc/initramfs-tools/initramfs.conf
```

Cambiamos la linea `COMPRESS=lz4` to `COMPRESS=gzip`\
guardamos y aplicamos los cambios

```shell
sudo update-initramfs -u -k all
```


# Como tener AirPrint con tu impresora

Podríamos definir a **AirPrint** como el **servicio de impresión inalámbrica de Apple**. Gracias a él, es posible enviar aquello que deseamos imprimir de forma total y completamente inalámbrica desde un iPhone o un iPad, fácilmente a cualquier impresora compatible que se encuentre conectada a nuestra red Wi-Fi, siempre que la impresora lo soporte... y muchos fabricantes tienen modelos que no lo soportan.

![](/files/UmegBz1gGwel5k7ifB1F)

En el caso de que nuestra impresora no tenga soporte oficial a AirPrint, necesitaremos un equipo o una placa raspberry o parecida con linux.

Instalaremos una serie de paquetes, por supuesto la impresora debe estar encendida, si es por wifi, conectada a la red de casa, si es cable, conectada a la placa raspberry o similar.

```sh
sudo apt install cups cups-core-drivers printer-driver-brlaser avahi-daemon libcups2-dev python3-dev python3-cups libxml-dev -y
```

Es una instalación sencilla de cups, un servidor de impresión.\
Para entrar en el dashboard web de cups:

```
http://IP_DEL_SERVIDOR_CUPS:631
```

Continuara...

<figure><img src="/files/qIc77vZuPKlA2AI6yKs7" alt=""><figcaption></figcaption></figure>


# Crear repo git desde el terminal

Con esto creamos un repo, en este ejemplo de nombre **REPO\_TEST** desde la consola, necesitamos el token que podremos generarlo desde [aqui](https://github.com/settings/tokens).

```shell
curl -s POST https://api.github.com/user/repos -H "Authorization: token ghp_nXqcBG3qohY3QBMLJ7sFOsCh8ysN8s1R5sWZ" -d "{\"name\":\"REPO_TEST\"}"
```


# Añadir marca de agua al DNI

A veces nos solicitan nuestro DNI para realizar tramites, y lo entregamos sin mas... ERROR!\
\
Con esto, añadimos una marca de agua al DNI, podemos poner "ES COPIA", "COPIA" o incluso detallar un poco a quien se lo entregamos, yo suelo poner "COPIA PARA xxxx" y añado el nombre de la empresa a quien se lo entrego.\
\
Lo primero es instalar el paquete necesario

```bash
sudo apt install imagemagick -y
```

Y ahora basta con tener nuestro DNI escaneado, vale una foto, lo dejas lo mas ajustado posible.\
\
Y para añadir la marca de agua:

```bash
convert -density 150 -fill "rgba(255,0,0,0.25)" -gravity Center -pointsize 70 -draw "rotate -45 text 0,0 'ES COPIA'" dni.jpeg  dni-marca.jpg
```

Podemos ajustar el tamaño del texto, en el parámetro

```bash
-pointsize 70
```

Mas valor, mas grande, menos, mas pequeño.

Si queremos añadir mas texto, podemos hacerlo de la siguiente manera, ejemplo especificar a quien o que va dirigido.

```bash
convert -density 150 -fill "rgba(255,0,0,0.50)" -pointsize 15 -draw "rotate -15 text 0,200 'ES COPIA'" -draw "rotate -15 text -25,260 'PARA LA EMPRESA XXXXXXXXX'" dni.jpeg  dni-marca2.jpg
```


# Eliminar un path con sed

Fichero actual, un ejemplo:

```shell
#sonar.tests=src/test/java,src/test/resources
```

Si queremos quitar el segundo path, lo hacemos con el sed.

```shell
sed -i 's|#sonar.tests=src/test/java,src/test/resources|sonar.tests=src/test/java|g' NombreDelFichero
```

y en una sola linea, le hemos quitado el #, y ademas la segunda ruta.

Ejemplo final en Jenkins

```groovy
stage('Code Quality Check via SonarQube') {
    steps {
        sh "sed -i 's|#sonar.tests=src/test/java,src/test/resources|sonar.tests=src/test/java|g' sonar-project.properties"
        runSonar("ci-code", "${NAME_PROJECT}", "${SONAR_TOKEN}")
    }
}
```


# Sacar el .crt y .key de un .pfx

Si tenemos un certificado en formato .pfx, y lo que necesitamos es el .crt y la clave privada en .key, tenemos que separar dichos ficheros del .pfx

Para ello, solo necesitamos OpenSSL, y la clave PEM con la que se genero el .pfx\\

![](/files/BANuCG3Z4nmFxPb8OziW)

\
**Extraer la clave privada a un fichero .key:**

```shell
openssl pkcs12 -in TU_FICHERO.pfx -nocerts -out FICHERO_CLAVE_PRIVADA.key
```

nos pedirá nuestra clave PEM, la metemos, nos la pedirá un par de veces para confirmar y si ha ido todo correctamente, tendremos nuetro .key con la clave privada

**Extraer el certificado a un fichero .crt:**

```shell
openssl pkcs12 -in TU_FICHERO.pfx -clcerts -nokeys -out CERTIFICADO.crt
```

lo mismo de antes, nos pedirá la clave PEM, y tendremos el .crt que es nuestro certificado.

\
Pero que ocurre si lo que necesitamos es nuestra clave privada sin cifrar?

```shell
openssl rsa -in FICHERO_CLAVE_PRIVADA.key -out FICHERO_CLAVE_PRIVADA_SIN_CIFRAR.key
```

Nos volverá a pedir la clave PEM que nos pidio la primera vez que sacamos el .key

También podemos tener nuestra clave privada, en formato PEM.

```shell
openssl rsa -in FICHERO_CLAVE_PRIVADA.key -outform PEM -out FICHERO_CLAVE_PRIVADA_PEM.key
```


# Instalar driver AMD GPU

## Instalar driver AMD GPU

![](/files/AQJDCQOzMUA7VDyb7bps)

Lo primero, es descargarnos el driver desde la web AMD <https://www.amd.com/en/support>, elegiremos nuestra GPU y nos descargamos el fichero.

![](/files/osz3bEVGO7fI6nx2C9EM)

nos dara varios sistemas operativos para nuestra grafica, elegimos el nuestro, en mi caso, Ubuntu x86 64bit

![](/files/0c2rtjNqsmut5YiooemG)

y descargamos el paquete.

![](/files/aorgOYAuAFPn0ijkSctt)

Con el fichero ya en nuestro equipo, los descomprimimos, y vemos que contiene muchos paquetes .deb y unos scripts de shell.

Para la instalacion tenemos varias formas

| **Command**                                                 | **Installed Components**                                                                                                                    |
| ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| `$ ./amdgpu-pro-install -y`                                 | <ul><li>Base kernel</li><li>Accelerated graphics</li><li>Mesa multimedia</li><li>Pro OpenGL</li><li>Pro Vulkan</li></ul>                    |
| `$ ./amdgpu-pro-install -y --opencl=rocr,legacy`            | <ul><li>Base kernel</li><li>Accelerated graphics</li><li>Mesa multimedia</li><li>Pro OpenGL</li><li>Pro Vulkan</li><li>Pro OpenCL</li></ul> |
| `$ ./amdgpu-pro-install -y --opencl=rocr,legacy --headless` | <ul><li>Only base kernel</li><li>Pro OpenCL (headless mode)</li></ul>                                                                       |

personalmente, siempre elijo la opcion pro con rocs y legacy, que incluye todo, desde la API de Vukan, OpenCL, y OpenGL

Antes de proceder a la instalacion, vamos a actualizar el sistema

```bash
sudo apt update && sudo apt -y upgrade
```

```bash
./amdgpu-pro-install -y --opencl=rocr,legacy
```

Y listo, reiniciamos el sistema y ya tenemos instalado el driver AMD GPU


# Problemas de Vsync con AMD GPU

Si tienes problemas despues de instalar los drivers oficiales de AMD en Linux, y cuando reproduces videos sobre todo si es HD/4K o juegos los ves asi, se llama tearing.\\

![](/files/GFHxeesjEYbcj2lBShDZ)

\
Lo primero es, si tienes los ultimos drivers, bien, si no, actualizalos antes.\
\
Creamos un fichero en

```
sudo vim /etc/X11/xorg.conf.d/20-radeon.conf
```

con el siguiente contenido y guardamos el fichero.

```
Section "Device"
    Identifier "Radeon"
    Driver "amdgpu"
    Option "TearFree" "on"
    Option "DRI" "3"
    Option "AccelMethod" "glamor"
    Option "VariableRefresh" "true"
EndSection
```

Y listo, ademas también hemos habilitado FreeSync si tu monitor es compatible, con el parametro "VariableRefresh "true", ahora solo queda reiniciar y adios al tearing.\
\
Valido en AMD GPU v21.30\
Ubuntu 20.04.2 y Linux Mint 20.2


# Configurar git

Despues de instalar git, necesitamos una configuracion minima para subir nuestro codigo a github

Lanzamos cada linea, no necesitamos permisos de root.

```shell
git config --global credential.helper store
git config --global user.name "your name"
git config --global user.email your_email@example.com
git config --global color.diff "auto"
git config --global color.status "auto"
git config --global color.branch "auto"
git config --global color.interactive "true"
git config --global help.format "html"
```

\
Ahora vamos a generar las claves ssh

```shell
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```

```shell
Generating public/private rsa key pair.
Enter file in which to save the key (/home/$USER/.ssh/id_rsa): 
Created directory '/home/$USER/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/$USER/.ssh/id_rsa.
Your public key has been saved in /home/$USER/.ssh/id_rsa.pub.
```

Copiamos nuestra clave

```shell
cat /home/$USER/.ssh/id_rsa.pub
```

\
Y lo pegamos en nuestro panel de configuracion en Github

<https://github.com/settings/ssh/new>

<figure><img src="/files/MrWw0Zc5H9dYDr8dCmnL" alt=""><figcaption></figcaption></figure>

Guardamos y probamos la conexion ssh

```shell
ssh -T git@github.com
```

```shell
The authenticity of host 'github.com (140.82.121.3)' can't be established.
ECDSA key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXX/XXXXXXXX/XXXXXXXX.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com,140.82.121.3' (ECDSA) to the list of known hosts.
Hi AzagraMac! You've successfully authenticated, but GitHub does not provide shell access.
```


# Solucion al error amdgpu: powerplay

'amdgpu: \[powerplay] failed send message: GetMaxDpmFreq'

Este es el error, se puede consultar llamando al "`dmesg`", y ocurre tanto en la v21.20 y v21.30 del driver AMD GPU en kernel anteriores a 5.8

```shell
[    6.498127] amdgpu: [powerplay] failed send message: TransferTableSmu2Dram (18) 	param: 0x00000006 response 0xffffffc2
[    6.498129] amdgpu: [powerplay] Failed to export SMU metrics table!
[    8.704702] amdgpu: [powerplay] failed send message: SetDriverDramAddrHigh (14) 	param: 0x00000080 response 0xffffffc2
[   10.913548] amdgpu: [powerplay] failed send message: TransferTableSmu2Dram (18) 	param: 0x00000006 response 0xffffffc2
[   10.913549] amdgpu: [powerplay] Failed to export SMU metrics table!
[   13.404472] amdgpu: [powerplay] failed send message: SetDriverDramAddrHigh (14) 	param: 0x00000080 response 0xffffffc2
[   15.894863] amdgpu: [powerplay] failed send message: SetDriverDramAddrHigh (14) 	param: 0x00000080 response 0xffffffc2
[   15.894865] amdgpu: [powerplay] Failed to export SMU metrics table!
[   18.384341] amdgpu: [powerplay] failed send message: SetDriverDramAddrHigh (14) 	param: 0x00000080 response 0xffffffc2
[   20.873506] amdgpu: [powerplay] failed send message: SetDriverDramAddrHigh (14) 	param: 0x00000080 response 0xffffffc2
[   20.873508] amdgpu: [powerplay] Failed to export SMU metrics table!
[   23.360578] amdgpu: [powerplay] failed send message: SetDriverDramAddrHigh (14) 	param: 0x00000080 response 0xffffffc2
[   25.848292] amdgpu: [powerplay] failed send message: SetDriverDramAddrHigh (14) 	param: 0x00000080 response 0xffffffc2
[   25.848294] amdgpu: [powerplay] Failed to export SMU metrics table!
[   28.939454] amdgpu: [powerplay] failed send message: GetMaxDpmFreq (31) 	param: 0x00000000 response 0xffffffc2
[   31.430048] amdgpu: [powerplay] failed send message: GetMaxDpmFreq (31) 	param: 0x00000000 response 0xffffffc2
[   33.920060] amdgpu: [powerplay] failed send message: GetMaxDpmFreq (31) 	param: 0x00000000 response 0xffffffc2
[   36.409185] amdgpu: [powerplay] failed send message: GetMaxDpmFreq (31) 	param: 0x00000000 response 0xffffffc2
[   38.896221] amdgpu: [powerplay] failed send message: GetMaxDpmFreq (31) 	param: 0x00020000 response 0xffffffc2
[   41.384883] amdgpu: [powerplay] failed send message: GetMaxDpmFreq (31) 	param: 0x00020000 response 0xffffffc2
[   43.863006] amdgpu: [powerplay] failed send message: GetMaxDpmFreq (31) 	param: 0x00020000 response 0xffffffc2
```

Lo primero, si la version del driver es la v21.30, tienes que hacer un downgrade a la v21.20 (dejo el link del paquete mas al final de post)\
para ello, en el directorio donde descomprimiste el driver v21.30 ejecuta

```shell
./amdgpu-pro-install --uninstall
```

Cuando termine, reinicia el equipo.\
Ahora con el driver problematico fuera, revisa la version del kernel, si es la 5.4 o cualquiera inferior a la 5.8, deberas actualizar a la 5.8 minimo.\
\
Si usas Linux Mint 20.2, por defecto trae la version 5.4\
Descarga el Kernel 5.8

```shell
wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.8/amd64/linux-headers-5.8.0-050800-generic_5.8.0-050800.202008022230_amd64.deb
wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.8/amd64/linux-image-unsigned-5.8.0-050800-generic_5.8.0-050800.202008022230_amd64.deb
wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.8/amd64/linux-headers-5.8.0-050800_5.8.0-050800.202008022230_all.deb
wget -c https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.8/amd64/linux-modules-5.8.0-050800-generic_5.8.0-050800.202008022230_amd64.deb
```

y lo instalamos

```shell
sudo dpkg -i *.deb
```

Si la instalacion termina sin errores, puedes reiniciar el equipo para cargar el nuevo kernel.

Ahora ya seria instalar los nuevos drivers v21.20 de AMDGPU

Te dejo los enlaces de ambas versiones por si cuando leas este post, ya no es posible descargarlas desde la web de AMD\
Version [21.20](https://mega.nz/file/RR5EjBAb#tPajDSXZbeKsHZFdVUtUhYLRdPpEU89H3Uw9x4VSudw)\
Version [21.30](https://mega.nz/file/Zd4AhLZK#DXEL_1BDNtPYFZ8HDFcT2dDdYbNyUnQQp0vSBuuI77g)


# dmesg: Error al leer el búfer del kernel

Si usas mucho el dmesg, te habras dado cuenta que ya no es posible leer los mensajes del kernel con un usuario normal, y necesitas ser root (super usuario), esto se debe a la implementacion del modulo `SECURITY_DMESG_RESTRICT`, evitando que los usuarios no root puedan leer el registro del núcleo de forma predeterminada\
(`sysctl: kernel.dmesg_restrict`)

Si solo quieres poder leerlo una vez con el usuario no root

```shell
sudo sysctl kernel.dmesg_restrict=0
```

Si lo que quieres es poder consultarlo siempre desde el usuario no root, entonces el cambio debe ser persistente.

Añade al final del fichero

```shell
sudo vim /etc/sysctl.d/10-local.conf
```

esta linea

```shell
kernel.dmesg_restrict = 0
```

Y reiniciar, ahora ya podras leer los mensajes del kernel con usuarios no root.\
Siempre podras hacerlo en todo caso con sudo

```shell
sudo dmesg
```


# CIDR, mascaras de subred

El CIDR se basa en el concepto de las [máscaras de subred](https://www.ibm.com/docs/es/aix/7.2?topic=addresses-subnet-masks). Una máscara se superpone a una dirección IP creando así una red secundaria supeditada a Internet. Esta **máscara de subred** señala al router qué porción de la dirección IP se reserva a los hosts (a cada integrante de la red) y qué parte identifica a la red.

![](/files/SJBHLlxs1MVozm0C55Ku)


# Macintosh


# My Apps

Estas son las Apps que suelo tener instaladas en mi MacBook Pro, tanto graficas como por consola, mayormente brew.

**Consola**

La gestion de paquetes, la hago con [brew](https://brew.sh)

```shell
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

```shell
brew install git neovim ffmpeg curl wget nmap tcpdump coreutils watch pv ansible bash-completion docker-completion libpcap kubectl imagemagick 
```

Java JDK 11.0.15

```shell
curl -L -b "oraclelicense=a" -O https://download.oracle.com/otn-pub/java/jdk/11.0.15%2B8/c4e1848573124815b77d6f1843afccb5/jdk-11.0.15_osx-x64_bin.dmg
```

ADB y Fastboot

* Link: <https://developer.android.com/studio/releases/platform-tools>

\
**Gráficas**

<figure><img src="/files/RY4YbYTTgsaRihaeYh2n" alt=""><figcaption></figcaption></figure>

* [AdguardHome](https://apps.apple.com/es/app/adguard-home-remote/id1543143740)
* [Adobe Reader](https://get.adobe.com/es/reader/)
* [Android File Transfer](https://www.android.com/filetransfer/)
* [AppCleaner](https://freemacsoft.net/appcleaner/)
* [Arduino IDE](https://www.arduino.cc/en/software)
* [CoconutBattery](https://www.coconut-flavour.com/coconutbattery/)
* [Cyberduck](https://cyberduck.io/download)
* [Firefox](https://www.mozilla.org/es-ES/firefox/all/#product-desktop-release)
* [Java JDK](https://download.oracle.com/java/17/latest/jdk-17_macos-x64_bin.dmg)
* [KeePassXC](https://keepassxc.org/download/)
* [Ledger Live](https://www.ledger.com/es/ledger-live)
* [MegaSync](https://mega.io/desktop)
* [Meld](https://github.com/yousseb/meld/releases)
* [OpenEmu](https://openemu.org/)
* [RaspberryPi Imager](https://github.com/raspberrypi/rpi-imager/releases)
* [Telegram](https://desktop.telegram.org)
* [Transmission](https://transmissionbt.com/download)
* [VLC](https://www.videolan.org/vlc/#download)
* [VirtualBox](https://www.virtualbox.org/wiki/Downloads) y su Extension Pack
* [Visual Studio Code](https://code.visualstudio.com)
* [WireGuard VPN](https://apps.apple.com/es/app/wireguard/id1451685025?mt=12)<br>


# Configurar shell bash por defecto

Listamos las shell disponibles.

```sh
cat /etc/shells
```

Nos devolverá las opciones disponibles:

```sh
MacBook-Pro:~ jose$ cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zshshell
```

Establecemos por defecto la deseada, en nuestro caso, bash, nos pedirá nuestra contraseña de nuestro usuario.

```sh
chsh -s /bin/bash
```

Cerramos la terminal y la volvemos abrir, si queremos asegurarnos de que estamos usando la shell correcta.

```sh
echo "$SHELL"
```


# Habilitar Bash Completion

Lo primero sera establecer por defecto bash en lugar de zsh

```shell
chsh -s /bin/bash
```

\
Instalamos el gestor de paquetes brew

```shell
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

La instalacion durara unos minutos, despues reiniciar el Mac.\
\
\
Instalar bash completion

```shell
brew install bash-completion
```

Y para terminar, metemos una linea en el .bash\_profile de nuestro usuario

```shell
echo "[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion" >> ~/.bash_profile
```

```shell
source ~/.bash_profile
```

\
Testing

```shell
$ git [tab][tab]
add               commit            gc                mv                request-pull      stage 
am                config            gitk              notes             reset             stash 
apply             checkout          grep              prune             restore           status 
archive           cherry            gui               pull              revert            submodule 
bisect            cherry-pick       help              push              rm                switch 
blame             describe          init              range-diff        scalar            tag 
branch            diff              instaweb          rebase            send-email        whatchanged 
bundle            difftool          log               reflog            shortlog          worktree 
citool            fetch             maintenance       remote            show              
clean             format-patch      merge             repack            show-branch       
clone             fsck              mergetool         replace           sparse-checkout
```


# Instalar Pyenv

<figure><img src="/files/S4uC1GAnGL5cysDyQKlg" alt=""><figcaption></figcaption></figure>

Instalamos dependencias

```sh
brew install openssl readline sqlite3 xz zlib tcl-tk
```

Ahora instalamos pyenv

```sh
brew install pyenv
```

Verificamos la version

```sh
pyenv --version
```

Instalamos version de python, podemos listar las opciones disponibles.

```sh
pyenv install --list
```

Ejemplo:

```sh
pyenv install 3.8.16
```

Establecer de forma global

```sh
pyenv global 3.8.16
```

Establecer de forma local

```sh
pyenv local 3.8.16
```

Listar las versiones de python instaladas, el \* marca la version seleccionada anteriormente.

```sh
$ pyenv versions
  system
* 3.8.16 (set by /Users/$user/.pyenv/version)
```

Añadimos al `.bash_profile`

```sh
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
```

Comprobamos que tenemos cargada la version elegida

```sh
$ python3 --version
Python 3.8.16
```


# Habilitar el "chime sound" en los nuevos Mac's

Chime sound, para quienes no lo sepan, hubo un tiempo que los Mac, hacian un sonido al encenderse, tambien hubo un tiempo que hasta tenian la manzana iluminada, pero eso es otro asunto.

Los ultimos Mac's, ya no tienen ese sonido de inicio que les daba esa personalidad, pero se puede habilitar.\
\
Para ello nos vamos a "Aplicaciones / Utilidades /" y abrimos "Terminal", escribimos en el la siguiente linea, nos pedira la password de nuestra usuario.

```shell
sudo nvram StartupMute=%00
```

![](/files/St1TLTtRXc1aTLBvjQzM)

Y reiniciamos el equipo. Ahora podremos volver a tener el mítico sonido de inicio.

{% embed url="<https://youtu.be/PLEupC2OWUU?t=18>" %}


# Reset NVRAM en un Macintosh

La memoria de acceso aleatorio no volátil (NVRAM, por sus siglas en inglés) es una pequeña porción de la memoria que tu Mac usa para almacenar ciertas configuraciones y acceder a ellas rápidamente. La PRAM (RAM de parámetros) almacena información similar y los pasos para restablecer la NVRAM y PRAM son los mismos.\
\
Lo primero, apaga el Mac, con el equipo apagado presiona durante al menos 20 segundos, las siguientes teclas

* **Opción** (Alt) ![](https://support.apple.com/library/content/dam/edam/applecare/images/en_US/macos/Catalina/macos-catalina-sidecar-sidebar-option-icon.png) en el lado izquierdo del teclado
* **Commad**  en el lado izquierdo del teclado
* **P** en el lado derecho del teclado
* **R** en el lado izquierdo del teclado

![](/files/hGd5TN9UG8Nvj7VPs4fA)

Sonara el "chime sound" 2 veces, puedes dejar de presionar las teclas después del segundo sonido de inicio, y el equipo arrancara normalmente.


# Reset PMU en un PowerBook G4

Cuando tienes alguno de los problemas que se plantean a continuación es necesario **restablecer el PMU (SMC)**

* Los ventiladores aceleran rápidamente sin motivo alguno.
* La retroiluminación del teclado no funcione correctamente no adaptándose a los cambios de luz ambiental.
* El ordenador no enciende cuando se pulsa en botón de arranque o se producen apagados inesperados sin ningún tipo de explicación.
* El ordenador funciona de manera lenta aunque no consuman muchos recursos de la CPU.
* La batería no se recarga correctamente o se descarga rápidamente.
* Los sensores de temperatura o batería no funciona perfectamente.

\
Antes de proceder a resetear la PMU o la SMC, debemos apagar el equipo, y pulsar durante 10 segundos las siguientes teclas.

* **Mayúsculas** ![](https://support.apple.com/library/content/dam/edam/applecare/images/en_US/macos/Catalina/macos-catalina-sidecar-sidebar-shift-icon.png) en el lado izquierdo del teclado
* **Control** ![](https://support.apple.com/library/content/dam/edam/applecare/images/en_US/macos/Catalina/macos-catalina-sidecar-sidebar-control-icon.png) en el lado izquierdo del teclado
* **Opción** (Alt) ![](https://support.apple.com/library/content/dam/edam/applecare/images/en_US/macos/Catalina/macos-catalina-sidecar-sidebar-option-icon.png) en el lado izquierdo del teclado
* **Power** en el lado derecho del teclado

Soltamos los botones, y esperamos 5 segundos antes de encenderlo.

![](/files/casEIAbU6MDZkXzJwZAm)

Al iniciar es muy probable que pierda la hora, si lo tienes conectado a internet, se actualizara solo a la fecha correcta.

En algunos Mac, con batería extraible, después de apagarlos, retiras la batería, desconectas si esta conectado el adaptador de corriente, presionas durante 5 segundos el botón de encendido, luego colocas la batería y lo enciendes normalmente.


# Solucionar el parpadeo de Netflix en Safari a pantalla completa

Seguramente te habras dado cuenta que al poner pantalla completa en Netflix usando Safari, parpadea la pantalla, cosa que no ocurre si sales de pantalla completa.

Una solucion es usar otro navegador como Chrome o Firefox, la otra solucioar el problema en Safari

Lo primero que vamos hacer es instalar el componente "**Silverlight**" de Microsoft.

![](/files/5Crf14GFZ18EvEgDFrBz)

Descargamos el complemento desde la web de Microsoft <https://www.microsoft.com/silverlight/>

Una vez descargado el .dmg los montamos y veremos un .pkg

![](/files/PcGatLYRvuPim29PHKR6)

Y procedemos a instalar el complemento. Importante, cierra Safari antes de comenzar la instalación.

Recomendable reiniciar el Mac, luego ya podremos ver Netflix sin parpadeo a pantalla completa.


# EverDrive

by Krikzz


# EverDrive N8

<figure><img src="/files/FAZeztpG05dvxnksCpbE" alt="" width="375"><figcaption></figcaption></figure>

[![Firmware EverDrive N8 v1.26](https://img.shields.io/badge/EverDrive%20N8%20Firmware-v1.26-blue.svg)](https://krikzz.com/pub/support/everdrive-n8/original-series/OS/)

{% embed url="<https://krikzz.com/our-products/legacy/edn8-72pin.html>" %}

**Specs:**

* [Cyclone II FPGA](https://www.mouser.es/new/altera/altera-cycloneii/?srsltid=AfmBOoqerDC9ZLWSmyc1MbtEppzMGLW2cfQkXHLLB9QlzteKxu7AYU8f)
* 2 x 512Kbyte SRAM for PRG and CHR data.
* 128Kbyte battery backed memory. It write save data to micro SD.
* Max II CPLD to handle FPGA reconfiguration, BIOS and SD interfaces.
* 1Mbyte flash BIOS.
* Voltage shift buffers on PPU and CPU bus for matching levels between 5v NES bus and 3.3 EverDrive bus. Far better than simple resistor buffers at reducing noise and power consumption

**Features:**

* Famicom, NES, and Twin Famicom systems are supported. Many NES/FC clones supported as well.
* Cart supports NES and FDS ROM images.
* Automatic disk side swap for FDS.
* Expansion audio, [NES systems require modification to support this feature.](https://github.com/azagramac/mods-nes/tree/master/AudioExpansionMod)
* Save State function
* Game Genie cheat code support.
* Automatically backs-up saves to micro SD card. There is no need to push reset before shutting down the system.\
  \&#xNAN;*FDS is the only exception, user should push the reset button on system to get back to main menu before than shutting down the system, otherwise FDS save data will be lost.*
* Mapper support can be extended via software updates. As easy as loading new mappers files on micro SD card.
* FAT / FAT16 / FAT32 file system formats are supported.
* Supports micro SD cards up to 32GB.
* Quick loading (4-8 seconds approx).

<figure><img src="/files/rNXTdHTFsYdQLw5xaWuY" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/FgK2S4SUFhF6p6hwkI0g" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/RlXhS9R3hpku7XbJBnGi" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/wVwOWJr0p1ggCBaofe1k" alt="PCB Everdrive N8 v1.4N"><figcaption></figcaption></figure>


# EverDrive GBA Mini

<figure><img src="/files/P2QO6N2P4tB3sE7V5zZx" alt="" width="375"><figcaption></figcaption></figure>

[![Firmware EverDrive GBA v1.17](https://img.shields.io/badge/EverDrive%20GBA%20Firmware-v1.17-blue.svg)](https://krikzz.com/pub/support/everdrive-gba/original-series/OS/)

{% embed url="<https://krikzz.com/our-products/cartridges/everdrive-gba-mini.html>" %}

**Specs:**<br>

* FPGA LATTICE iCE40HX1K-VQ100
* Logic Cells 1.280
* RAM4K Memory Blocks 16
* RAM4K RAM bits 64K

\
**Features:**<br>

* All save types supported, no ROM patching required
* Fast Loading (most games load within 1 - 2 seconds)
* Hard gold plating for cartridge contacts
* 256Mbit PSRAM (32MByte) ROM memory
* 1Mbit SRAM (128KByte) save memory
* Real-time clock support
* Low power consumption
* FAT32 support
* Supported with GameCube player, some revisions of Super Retro Advance adapter and other GBA accessories
* NES, GB and GBC ROM formats are support (emulation mode)

<figure><img src="/files/qtH2gAgHx1j2OxQcPomh" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/xcvZ7wIgJ1YS326xcrxg" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/iiAjuoGX4qo6BcXdR6kF" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/AqiJbWoCKqOZMjGbLgv4" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/FtO1VVL6Q2LyV8Jmg2oX" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/FFHuZuvTRiMLt0YAfYZv" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/ye9JetbbUhZmLZn7911p" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/AxTRwMYCevPWWuC374xx" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/aEVErTdeSdsF3lFgNsG0" alt=""><figcaption></figcaption></figure>


# EverDrive N8 Pro

<figure><img src="/files/jg7e03KyRxADnlwOdQgm" alt=""><figcaption></figcaption></figure>

[![EverDrive N8 Pro Firmware v25.1123](https://img.shields.io/badge/EverDrive%20N8%20Pro%20Firmware%20\(.efu\)-v25.11237-blue.svg)](https://krikzz.com/pub/support/everdrive-n8/pro-series/firmware/)

[![EverDrive N8 Pro OS EDN8-V2.15](https://img.shields.io/badge/EverDrive%20N8%20Pro%20OS%20\(EDN8\)-V2.15-green.svg)](https://krikzz.com/pub/support/everdrive-n8/pro-series/firmware/)

{% embed url="<https://krikzz.com/our-products/cartridges/everdrive-n8-pro-72pin.html>" %}

**Specs:**

* [Cyclone IV FPGA](https://www.altera.com/products/fpga/cyclone/iv/e/ep4ce15-f23/EP4CE15F23C8N)
* Hard gold plating for cartridge contacts
* 16MB of ROM memory. 8MB for PRG and 8MB for CHR.
* 256K of battery ram for saves.

**Features:**

* Real time clock for logging date and time of saves.
* High quality 6-layers PCB.
* ARM based 32bit I/O co-processor for SD and USB operations acceleration.
* Up to 1024 files per folder, or unlimited if file sorting disabled.
* In-game menu. You can save game or return to system menu without physical reset.
* Multi slot save states. 100 independent slots for save states.
* Instant ROM loading.
* USB port for development and system update without removing micro SD card.
* Improved audio mixing circuit with op amp.
* Expansion audio, [NES systems require modification to support this feature.](https://github.com/azagramac/mods-nes/tree/master/AudioExpansionMod)
* Dedicated button, which is used for swap FDS disk side or as alternate method to call Save State menu.
* Built-in NSF player with expansion chips support (VRC6, VRC7, Sunsoft-5b, Namco-163).
* Battery voltage monitoring. Battery can be replaced in time if it going dry.
* Wide range of supported mappers.
* NES2.0 partial support.
* [Game Genie cheats support.](https://gamegenie.com/cheats/gamegenie/nes/index.html)

<br>


# NeoGeo


# Arquitectura NeoGeo AES

<figure><img src="/files/PRjyBeMnUMDppEebJ2wC" alt=""><figcaption></figcaption></figure>

#### Especificaciones técnicas

### 🎮 NEOGEO AES — Información técnica estructurada

#### 🧠 1. Arquitectura del sistema

* 🏗️ **Plataforma:** SNK Multi Video System (MVS) adaptada a hogar (AES)
* 🧩 **CPU principal:** Motorola 68000 @ 12 MHz
* ⚙️ **CPU secundaria (sonido):** Zilog Z80 @ 4 MHz
* 🔊 **Chip de sonido:** Yamaha YM2610
  * Síntesis FM (YM2610 + ADPCM-A/B)
  * 15 canales de audio combinados (FM + samples)

***

#### 🎨 2. Sistema gráfico

* 🖼️ **Resolución base:** 320×224 píxeles
* 🎨 **Paleta total:** hasta 65.536 colores
* 🌈 **Colores simultáneos en pantalla:** hasta 4.096
* 🧱 **Sprites:**
  * Hasta \~380 sprites en pantalla (dependiendo de tamaño)
  * Tamaño variable (8×8 hasta 16×512 px)
* 🧩 **Planos de scroll:** múltiples capas (background + foreground)
* ⚡ Hardware especializado para animaciones sin sobrecargar CPU

***

#### 💾 3. Memoria y almacenamiento

* 🧠 **RAM principal:** \~64 KB (work RAM)
* 🎮 **VRAM:** dedicada al subsistema gráfico
* 💿 **Formato de juegos:** cartuchos ROM
* 📦 **Capacidad de cartuchos:**
  * Desde \~46 Mbit hasta más de 716 Mbit (y superiores en títulos tardíos)
* 💾 **Memory Card:** 2 KB, nuevas 16 KB
  * Guardado de progreso y récords
  * Persistencia entre juegos compatibles

***

#### 🎮 4. Sistema de cartuchos

* 🔌 **Conector propietario NEOGEO AES**
* 🔁 Compatibilidad:
  * AES ↔ MVS (con adaptaciones físicas)
* 🧩 Arquitectura dividida en chips:
  * Program ROM (CPU)
  * Sound ROM
  * Graphic ROM (sprites y tiles)

***

#### 🔊 5. Audio

* 🎵 **Motor principal:** Yamaha YM2610
* 🎚️ Características:
  * FM synthesis (instrumentos complejos)
  * PCM samples (efectos y voces)
  * ADPCM para audio comprimido
* 🔉 Salida estéreo

***

#### 📺 6. Salida de vídeo (corregido)

* 🧷 **Salida principal: RGB analógico (RGBS)**
  * Señal RGB + sincronía compuesta (Sync on Composite / CSYNC según cableado)
* 🔌 **Conector estándar: DIN-8 (NEOGEO AES)**
  * Pinout propietario SNK para vídeo RGB + audio
* 📼 **Señal disponible según cableado/adaptador:**
  * 🎨 **RGB (calidad arcade / profesional) — nativa**
  * 📺 **Compositado (CVBS) — derivado mediante cable o conversión externa**
  * 📡 **S-Video — NO nativo (solo mediante modificaciones o adaptadores externos)**

***

#### 🎮 7. Controles

* 🎮 Puertos: 2 mandos (DB15 propietario)
* 🕹️ Tipo de control:
  * Joystick digital de microswitch
  * 4 botones principales (A, B, C, D)
* ⚙️ Expansión: algunos periféricos arcade stick oficiales

***

#### 🌍 8. Bloqueo regional

* 🧭 Implementado principalmente en la **BIOS del sistema**
* 🌐 Regiones típicas:
  * 🇯🇵 Japón
  * 🇺🇸 USA
  * 🌍 Export / Asia (según BIOS)
* ⚙️ Efectos del bloqueo:
  * Cambios en idioma (Japonés/Inglés)
  * Modificación de contenido (ej. sangre vs “sweat” en algunos juegos)
  * Ajustes de dificultad y comportamiento de juegos
  * Mensajes de error o limitaciones en algunos títulos si región no coincide

***

#### 🧠 9. BIOS como punto de control

* 🧩 La **BIOS es el único “punto central” de lógica de control**
* Funciones:
  * Inicialización del sistema
  * Menú de servicio (DIP settings)
  * Gestión de memory card
  * Rutinas de arranque de cartucho
* 🔓 Importante:
  * La BIOS puede ser reemplazada (ej. UniBIOS)
  * Esto elimina prácticamente todas las restricciones regionales

***

#### ⚙️ 10. DIP switches

* 🔧 Interruptores físicos en la placa o accesibles vía menú
* Controlan:
  * Región lógica (en combinación con BIOS)
  * Modo arcade vs home
  * Dificultad base
  * Configuración de sistema (coin settings en MVS, limitado en AES)

***

#### 💾 11. Memory Card (seguridad de datos)

* 💾 Sistema de guardado externo simple
* 🔐 No cifrado:
  * Datos almacenados en formato propietario pero no seguro
  * Puede ser leído/modificado con herramientas externas

#### Fotos

<figure><img src="/files/lMF3hSkMrVSABG3OELZa" alt=""><figcaption></figcaption></figure>


# NeoGeo AES+

<figure><img src="/files/ixSTlg5nZS03lvKa1jQx" alt=""><figcaption></figcaption></figure>

### 🎮 KEY FEATURES — NEOGEO AES+

#### 📦 Contenidos

* 🕹️ **Legendaria consola de videojuegos renacida**
* 📺 **Réplica 1:1 de la consola original de los años 90**
* 🎨 **Construcción arcade auténtica sin concesiones**
* 🧠 **Reimplementación fiel del hardware original**
* 🚫 **Sin emulación — basada en chips ASIC rediseñados**

***

#### 🎯 Compatibilidad

* 🎮 Compatible con nuevos cartuchos NEOGEO AES
* 🔁 Retrocompatible con cartuchos originales NEOGEO AES

***

#### ⚙️ Funciones de calidad de vida

* ⚡ Salida HDMI de baja latencia
* 📼 Salida AV original para entusiastas de CRT
* 🔧 Interruptores DIP para:
  * 🌐 Selección de idioma
  * 🚀 Overclocking
  * 🖥️ Selección de modo de pantalla
* 💾 Guardado permanente de récords (High Score Save) mediante Memory Card incluida

***

#### 🎮 Incluye

* 🖥️ Consola **NEOGEO AES+**
* 🎮 Arcade Stick inalámbrico
* 📺 Cable HDMI
* 🔌 Fuente de alimentación

En la edicion blanca incluye ademas de lo anterior.

* 🧩 Cartucho del juego **Metal Slug (Blanco), edición exclusiva**
* 🎮 Arcade Stick inalámbrico (Blanco) — réplica 1:1 del original
* 💾 Memory Card (Blanca)
* 📡 Dongle inalámbrico Arcade Stick (15 pines, blanco)
* 🔌 Cable Arcade Stick (15 pines)
* ⚡ Cable de carga USB-C para Arcade Stick

***

{% embed url="<https://www.youtube.com/watch?v=U7J0whhwi0U>" %}

#### Edición negra

<figure><img src="/files/KKW2Aq5R7OoLXLGhocT8" alt=""><figcaption></figcaption></figure>

<div><figure><img src="/files/fbuyK3JIqKqXW1qZzSVr" alt="" width="375"><figcaption><p>NeoGeo AES+</p></figcaption></figure> <figure><img src="/files/JvU6TtjEAPyxJ2qSyw9Y" alt="" width="375"><figcaption><p>Stick</p></figcaption></figure> <figure><img src="/files/vfbHy5sdOpPSWnWPmJdw" alt="" width="375"><figcaption><p>Memory Card</p></figcaption></figure></div>

#### Edición blanca

<figure><img src="/files/zWD5f5UjMSfOWO9lojFl" alt=""><figcaption></figcaption></figure>

<div><figure><img src="/files/t7rSgF7Sc2vVBdPWJHSU" alt="" width="188"><figcaption><p>NeoGeo AES+ White</p></figcaption></figure> <figure><img src="/files/ViCPZo59q7lnTqi7LcYF" alt="" width="188"><figcaption><p>Stick White</p></figcaption></figure> <figure><img src="/files/1fvO9oWbGty0W2fjoFFt" alt="" width="188"><figcaption><p>Memory Card White</p></figcaption></figure> <figure><img src="/files/WxvGUpMdn7q2Ehy6PPPV" alt="" width="188"><figcaption><p>Metal Slug White</p></figcaption></figure></div>

#### Links de compra:

* **NeoGeo AES+ (negra)**\
  Amazon: <https://amzn.to/4cIdVGB><br>
* **Stick:**\
  Amazon: <https://amzn.to/4tKpuTV><br>
* **Memory Card:**\
  Amazon: <https://amzn.to/4cXB8mW><br>
* **Juegos:**\
  Metal Slug: <https://amzn.to/4tKpFP5>\
  The King of Fighters 2002: <https://amzn.to/4uf08wZ>\
  Garou: Mark of the Wolves: <https://amzn.to/42EuugJ>\
  Samurai Shodown V Special: <https://amzn.to/4tDkwbi>\
  Big Tournament Golf: <https://amzn.to/4eTcl6a>\
  Shock Troopers: <https://amzn.to/4eSOLGE>\
  Pulstar: <https://amzn.to/4ekJxU0>\
  Magician Lord: <https://amzn.to/4t6QbRs>\
  Over Top: <https://amzn.to/42FgoM4>\
  Twinkle Star Sprites: <https://amzn.to/3PcWN2H>


# Review 161 en 1 AES

\
![](/files/t5aDyjpxxD9t0T7Fm4mm) ![](/files/RpcLtz2DVcut4b7HXsyp)

![](/files/Mj1Xoc2J4PcP4hU350uR) ![](/files/JsD0toYYBbdNBrqB5ft0)<br>

<figure><img src="/files/HxyJ3lbRjzld2dh4IR6Y" alt=""><figcaption></figcaption></figure>

| Attribute           | Value                                                  |
| ------------------- | ------------------------------------------------------ |
| Product type        | Arcade multi-game cartridge                            |
| Architecture        | Dual-board system (Board A + Board B)                  |
| Total weight        | **358 g**                                              |
| Included components | 2 PCB boards + plastic shell + printed label           |
| Enclosure           | Injection-molded plastic cartridge housing             |
| Label               | Printed adhesive sticker (front artwork)               |
| Power domain        | 3.3 V / 5 V mixed logic system                         |
| Interconnect        | 8-pin inter-board connector (J2 / J3A depending board) |

#### BOM – 161-in-1 (Board A)

<figure><img src="/files/li9nJmRGk35SWHKmvKaN" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/Jq1qKC9WmGka79LvmUUP" alt=""><figcaption></figcaption></figure>

<div><figure><img src="/files/wLmLcMGQ202g7YqMXUP4" alt=""><figcaption></figcaption></figure> <figure><img src="/files/41vqooMKRn8OHtNR0a7c" alt=""><figcaption></figcaption></figure> <figure><img src="/files/bubmGvg1iVLFZ4BhEXRk" alt=""><figcaption></figcaption></figure> <figure><img src="/files/i4392yJzIkTOZRgM9h1V" alt=""><figcaption></figcaption></figure> <figure><img src="/files/qRLQE4NmVIXQSkEYY7sP" alt=""><figcaption></figcaption></figure></div>

<table><thead><tr><th>RefDes</th><th>Component</th><th width="140">Type</th><th>Package</th><th>Part Number / Value</th><th>Function</th><th>Notes</th></tr></thead><tbody><tr><td>U2</td><td>Altera MAX 3000A CPLD</td><td>Programmable Logic</td><td>TQFP-144</td><td>EPM3256ATC144-10</td><td>Main bus decoding and control logic</td><td>Handles memory banking and ROM address decoding</td></tr><tr><td>U3</td><td>Altera MAX II CPLD</td><td>Programmable Logic</td><td>TQFP-100</td><td>EPM240T100C5N</td><td>Auxiliary system logic</td><td>Likely menu control or signal arbitration</td></tr><tr><td>S1</td><td>Parallel NOR Flash</td><td>Memory</td><td>TSOP-56</td><td>JS28F256M29EWH (256 Mbit / 32 MB)</td><td>ROM storage</td><td>Part of shared ROM pool (P/C/V mapping depending on design)</td></tr><tr><td>M1</td><td>Parallel NOR Flash</td><td>Memory</td><td>TSOP-56</td><td>JS28F512M29EWL (512 Mbit / 64 MB)</td><td>Main ROM storage</td><td>Likely program ROM or mixed code/data storage</td></tr><tr><td>C1 / C2</td><td>F0095H0</td><td>High-density NOR Flash module</td><td>BGA / custom module</td><td>~8 Gbit (~1 GB estimated total)</td><td>Main ROM backend storage</td><td>Internally composed of multiple Micron-style dies</td></tr><tr><td>CE1 / CE2</td><td>SMD aluminum electrolytic capacitor</td><td>Passive component</td><td>SMD radial</td><td>100 µF / 10 V</td><td>Power supply filtering</td><td>Stabilizes 3.3V / 5V rails under load</td></tr><tr><td>U1</td><td>Voltage regulator (LDO)</td><td>Power management</td><td>SOT-223</td><td>1117 3.3 BWQ61</td><td>3.3V regulation</td><td>Main logic supply rail</td></tr><tr><td>J2</td><td>Connector</td><td>Board connector</td><td>Through-hole</td><td>8-pin connector</td><td>Inter-board communication</td><td>Link between Board A and Board B</td></tr><tr><td>C1, C2, C4, C5, C6, C7, C13, C16</td><td>SMD capacitors</td><td>Passive component</td><td>SMD</td><td>Unspecified</td><td>Decoupling / filtering</td><td>Local power stabilization and noise suppression</td></tr></tbody></table>

#### BOM – 161-in-1 (Board B)

<figure><img src="/files/BLQLPOGNfotHLySg7Wbc" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/KHq931XGxLyeJNvSkSMV" alt=""><figcaption></figcaption></figure>

<div><figure><img src="/files/4Cdg3s8sQIpxtFXbuzkc" alt=""><figcaption></figcaption></figure> <figure><img src="/files/vyQ3tb1fGV6ujPUSxq74" alt=""><figcaption></figcaption></figure> <figure><img src="/files/v6FlWpTONCodWGRY0iD1" alt=""><figcaption></figcaption></figure> <figure><img src="/files/1ee67fkwMRyWBa80PUUK" alt=""><figcaption></figcaption></figure> <figure><img src="/files/Zbwut7lA5hmMYUsWIf22" alt=""><figcaption></figcaption></figure> <figure><img src="/files/wvd6PbsyHItBGGy3fNn3" alt=""><figcaption></figcaption></figure></div>

<table><thead><tr><th width="114">RefDes</th><th>Component</th><th width="138">Type</th><th>Package</th><th>Part Number / Value</th><th>Function</th><th>Notes</th></tr></thead><tbody><tr><td>P1</td><td>High-density NOR Flash</td><td>Memory</td><td>BGA / custom module</td><td>F0095H0</td><td>ROM storage (program/data segment)</td><td>Part of main game data backend</td></tr><tr><td>P2</td><td>High-density NOR Flash</td><td>Memory</td><td>BGA / custom module</td><td>F0095H0</td><td>ROM storage (program/data segment)</td><td>Paired with P1 for expanded storage</td></tr><tr><td>U5</td><td>74LS245</td><td>Bus transceiver</td><td>SOIC / DIP variant</td><td>12AYHEK LS245</td><td>Data bus buffering</td><td>Directional bus isolation</td></tr><tr><td>U6</td><td>74LS245</td><td>Bus transceiver</td><td>SOIC / DIP variant</td><td>91CKYGK LS245</td><td>Data bus buffering</td><td>Secondary bus driver</td></tr><tr><td>U8</td><td>STC Microcontroller</td><td>MCU</td><td>LQFP-44</td><td>STC89C52RC</td><td>System control MCU</td><td>Menu/system logic controller</td></tr><tr><td>X1</td><td>Crystal / Oscillator</td><td>Clock source</td><td>HC-49 / SMD</td><td>FS11.05P</td><td>System clock generation</td><td>Frequency reference for MCU/CPLD</td></tr><tr><td>CP1</td><td>Altera MAX 3000A CPLD</td><td>Programmable logic</td><td>TQFP-144</td><td>EPM3256ATC144-10N</td><td>Logic control / banking</td><td>Core address decoding logic</td></tr><tr><td>PCM2</td><td>Altera MAX 3000A CPLD</td><td>Programmable logic</td><td>TQFP-144</td><td>EPM3256ATC144-10N</td><td>Secondary logic control</td><td>Likely ROM mapping / signal control</td></tr><tr><td>U7</td><td>Voltage regulator</td><td>LDO</td><td>SOT-223</td><td>1117 3.3 BWQ61</td><td>3.3V power regulation</td><td>Main logic rail supply</td></tr><tr><td>D1</td><td>Diode</td><td>Protection diode</td><td>SMD</td><td>T4</td><td>Reverse polarity / protection</td><td>Power input protection</td></tr><tr><td>PC1–PC5, PC22–PC23</td><td>SMD capacitors</td><td>Passive</td><td>SMD</td><td>Unspecified</td><td>Decoupling / filtering</td><td>Local power stabilization</td></tr><tr><td>C9, C10</td><td>SMD capacitors</td><td>Passive</td><td>SMD</td><td>Unspecified</td><td>Decoupling / filtering</td><td>Noise suppression near logic</td></tr><tr><td>R1–R9</td><td>SMD resistors</td><td>Passive</td><td>SMD</td><td>103 (10 kΩ)</td><td>Pull-up / pull-down network</td><td>Bus stabilization / logic bias</td></tr><tr><td>J3A</td><td>Connector</td><td>Board connector</td><td>Through-hole / edge</td><td>8-pin connector</td><td>Inter-board communication</td><td>Link between Board A and B</td></tr></tbody></table>

#### 🕹️ Lista de juegos

> Eliminados hacks, bootlegs, conversiones no oficiales, versiones modificadas y títulos duplicados.
>
> Resultado: **92 juegos únicos** del catálogo NeoGeo MVS.

***

## 🥊 Juegos de Lucha

<table><thead><tr><th width="74">Nº</th><th width="300">Juego</th></tr></thead><tbody><tr><td>1</td><td>🥊 SNK vs Capcom: SVC Chaos</td></tr><tr><td>2</td><td>👑 The King of Fighters '94</td></tr><tr><td>3</td><td>👑 The King of Fighters '95</td></tr><tr><td>4</td><td>👑 The King of Fighters '96</td></tr><tr><td>5</td><td>👑 The King of Fighters '97</td></tr><tr><td>6</td><td>👑 The King of Fighters '98</td></tr><tr><td>7</td><td>👑 The King of Fighters '99</td></tr><tr><td>8</td><td>👑 The King of Fighters 2001</td></tr><tr><td>9</td><td>👑 The King of Fighters 2002</td></tr><tr><td>10</td><td>👑 The King of Fighters 2003</td></tr><tr><td>11</td><td>⚔️ Samurai Shodown</td></tr><tr><td>12</td><td>⚔️ Samurai Shodown II</td></tr><tr><td>13</td><td>⚔️ Samurai Shodown III</td></tr><tr><td>14</td><td>⚔️ Samurai Shodown IV</td></tr><tr><td>15</td><td>⚔️ Samurai Shodown V Special</td></tr><tr><td>16</td><td>🌙 The Last Blade</td></tr><tr><td>17</td><td>🌙 The Last Blade 2</td></tr><tr><td>18</td><td>🐺 Garou: Mark of the Wolves</td></tr><tr><td>19</td><td>🐉 Double Dragon</td></tr><tr><td>20</td><td>🥋 Art of Fighting 2</td></tr><tr><td>21</td><td>💥 Karnov's Revenge</td></tr><tr><td>22</td><td>🧢 Fatal Fury</td></tr><tr><td>23</td><td>🌎 World Heroes</td></tr><tr><td>24</td><td>🌎 World Heroes 2</td></tr><tr><td>25</td><td>🔥 Breakers</td></tr><tr><td>26</td><td>🔥 Breakers Revenge</td></tr><tr><td>27</td><td>⚡ Savage Reign</td></tr><tr><td>28</td><td>🤝 Kizuna Encounter</td></tr><tr><td>29</td><td>🐲 Rage of the Dragons</td></tr></tbody></table>

***

## 🚀 Shoot'em Up

<table><thead><tr><th width="68">Nº</th><th width="300">Juego</th></tr></thead><tbody><tr><td>30</td><td>✈️ Strikers 1945</td></tr><tr><td>31</td><td>✈️ Aero Fighters 2</td></tr><tr><td>32</td><td>✈️ Aero Fighters 3</td></tr><tr><td>33</td><td>⭐ Blazing Star</td></tr><tr><td>34</td><td>🌌 Pulstar</td></tr><tr><td>35</td><td>🚀 Alpha Mission II</td></tr><tr><td>36</td><td>🛰️ Last Resort</td></tr><tr><td>37</td><td>👁️ Viewpoint</td></tr><tr><td>38</td><td>⚔️ Zed Blade</td></tr><tr><td>39</td><td>🚁 Andro Dunos</td></tr><tr><td>40</td><td>🍅 Captain Tomaday</td></tr><tr><td>41</td><td>🦕 Prehistoric Isle 2</td></tr></tbody></table>

***

## 💣 Acción / Run & Gun

<table><thead><tr><th width="71">Nº</th><th width="300">Juego</th></tr></thead><tbody><tr><td>42</td><td>💥 Metal Slug</td></tr><tr><td>43</td><td>💥 Metal Slug 2</td></tr><tr><td>44</td><td>💥 Metal Slug X</td></tr><tr><td>45</td><td>💥 Metal Slug 3</td></tr><tr><td>46</td><td>💥 Metal Slug 4</td></tr><tr><td>47</td><td>🔫 Shock Troopers 2nd Squad</td></tr><tr><td>48</td><td>🥷 Ninja Commando</td></tr><tr><td>49</td><td>🏹 Top Hunter</td></tr><tr><td>50</td><td>🔵 Blue's Journey</td></tr><tr><td>51</td><td>🤖 Robo Army</td></tr><tr><td>52</td><td>☢️ Mutation Nation</td></tr><tr><td>53</td><td>🏯 Sengoku</td></tr><tr><td>54</td><td>🏯 Sengoku 3</td></tr><tr><td>55</td><td>🤖 Eight Man</td></tr><tr><td>56</td><td>👊 Burning Fight</td></tr><tr><td>57</td><td>⚔️ Crossed Swords</td></tr></tbody></table>

***

## ⚽ Deportes

<table><thead><tr><th width="66">Nº</th><th width="300">Juego</th></tr></thead><tbody><tr><td>58</td><td>⚽ Super Sidekicks 2</td></tr><tr><td>59</td><td>⚽ Super Sidekicks 3</td></tr><tr><td>60</td><td>⚽ Ultimate 11</td></tr><tr><td>61</td><td>🏆 Neo Geo Cup '98</td></tr><tr><td>62</td><td>⚽ Pleasure Goal</td></tr><tr><td>63</td><td>🤖 Soccer Brawl</td></tr><tr><td>64</td><td>🏈 Football Frenzy</td></tr><tr><td>65</td><td>🏀 Street Hoop</td></tr><tr><td>66</td><td>⚾ Baseball Stars 2</td></tr><tr><td>67</td><td>⚾ 2020 Super Baseball</td></tr><tr><td>68</td><td>🐎 Stakes Winner</td></tr><tr><td>69</td><td>🐎 Stakes Winner 2</td></tr><tr><td>70</td><td>⛳ Neo Turf Masters</td></tr></tbody></table>

***

## 🧩 Puzles y Casual

<table><thead><tr><th width="67">Nº</th><th width="300">Juego</th></tr></thead><tbody><tr><td>71</td><td>🫧 Puzzle Bobble</td></tr><tr><td>72</td><td>🫧 Puzzle Bobble 2</td></tr><tr><td>73</td><td>🎈 Puzzle de Pon</td></tr><tr><td>74</td><td>🎈 Puzzle de Pon! R</td></tr><tr><td>75</td><td>✨ Magical Drop 2</td></tr><tr><td>76</td><td>✨ Magical Drop III</td></tr><tr><td>77</td><td>💣 Panic Bomber</td></tr><tr><td>78</td><td>💰 Money Puzzle Exchanger</td></tr></tbody></table>

***

## 🏎️ Carreras

<table><thead><tr><th width="72">Nº</th><th width="300">Juego</th></tr></thead><tbody><tr><td>79</td><td>🏁 Over Top</td></tr><tr><td>80</td><td>🚗 Thrash Rally</td></tr><tr><td>81</td><td>🚙 Neo Drift Out</td></tr></tbody></table>

***

## 🎮 Otros

<table><thead><tr><th width="67">Nº</th><th width="300">Juego</th></tr></thead><tbody><tr><td>82</td><td>😂 Matrimelee</td></tr><tr><td>83</td><td>🏴‍☠️ Spin Master</td></tr><tr><td>84</td><td>⚔️ Ganryu</td></tr><tr><td>85</td><td>🎱 Bang Bead</td></tr><tr><td>86</td><td>🥏 Battle Flip Shot</td></tr><tr><td>87</td><td>🎭 Far East of Eden: Kabuki Klash</td></tr><tr><td>88</td><td>🥊 Legend of Success Joe</td></tr><tr><td>89</td><td>👹 King of Monsters</td></tr><tr><td>90</td><td>♟️ Master of Syougi</td></tr><tr><td>91</td><td>🐰 Zupapa</td></tr></tbody></table>

***

## 📊 Estadísticas

<table><thead><tr><th width="393">Categoría</th><th width="112" align="right">Cantidad</th></tr></thead><tbody><tr><td>📦 Juegos anunciados en el cartucho</td><td align="right">161</td></tr><tr><td>🚫 Hacks / bootlegs / conversiones</td><td align="right">~69</td></tr><tr><td>🎮 Juegos únicos reales</td><td align="right">~92</td></tr><tr><td>🏢 Juegos oficiales NeoGeo</td><td align="right">~85</td></tr><tr><td>⭐ Imprescindibles del catálogo</td><td align="right">~65</td></tr></tbody></table>

***

## 📝 Conclusión

Aunque el cartucho se comercializa como **"161-in-1"**, tras eliminar:

* 🚫 Hacks
* 🚫 Bootlegs
* 🚫 Conversiones no oficiales
* 🚫 Versiones Plus/Magic/Orochi
* 🚫 Duplicados

el contenido real queda reducido a unos **92 títulos distintos**, de los cuales aproximadamente **85 son juegos oficiales del catálogo NeoGeo MVS**.

Esto significa que cerca del **43% del menú está compuesto por variantes  añadidas para inflar la cifra de juegos anunciados, si lo llamaran 92 en 1, seria mas realista.**

<figure><img src="/files/ZgnJiZc2EXfkpLkVxg49" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/TduoAYxNMrTUecUBLp5U" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/fom1KfyPxWWRsnq9EiUn" alt=""><figcaption></figcaption></figure>

\
Enlace de compra, cupon descuento `SRZLYFLHFDMW`

{% embed url="<https://es.aliexpress.com/item/1005007640720198.html>" %}


# Nintendo NES


# Arquitectura de la NES

<figure><img src="/files/bNLzfoQA3EbivbxhSJ3v" alt=""><figcaption></figcaption></figure>

#### <br>

La **Nintendo Entertainment System (NES)** es una **consola de videojuegos de 8 bits** lanzada por Nintendo en 1983 (Japón) y 1985 (EE. UU.).

La producción de la NES (Nintendo Entertainment System) finalizó oficialmente en distintos años según la región:

* **Japón (Famicom):** la Famicom dejó de producirse en **1995**.
* **Estados Unidos / Europa (NES):** la NES se fabricó hasta **1995 en EE. UU.**, aunque en Europa algunas unidades se vendieron hasta **1997**.

A nivel técnico:

* **CPU:** Ricoh 2A03 (NTSC) / 2A07 (PAL), derivado del MOS 6502, con APU integrada.
* **PPU:** Picture Processing Unit, coprocesador de vídeo que genera gráficos de **background y sprites**, usando tiles y paletas, totalmente independiente de la CPU.
* **Memoria RAM interna:** 2 KB (WRAM) para la CPU.
* **VRAM:** 2 KB de memoria para NameTables, usada por la PPU; el resto del patrón gráfico reside en CHR-ROM/RAM del cartucho.
* **APU:** Audio Processing Unit integrada en la CPU, 5 canales de sonido (2×pulse, 1×triangle, 1×noise, 1×DMC).
* **Lockout chip (CIC):** evita el uso de cartuchos no autorizados y controla compatibilidad regional.<br>

#### **Especificaciones técnicas:**

| CPU            | Región | Consola       | Freq.        |
| -------------- | ------ | ------------- | ------------ |
| **Ricoh 2A03** | NTSC   | NES / Famicom | 1.789773 MHz |
| **Ricoh 2A07** | PAL    | NES PAL       | 1.662607 MHz |

La CPU de la NES está basada en el [**MOS Technology 6502**](https://es.wikipedia.org/wiki/MOS_6502) de 8-bit que trabaja a **1.78 MHz** en sistemas NTSC o **1.66 MHz** en sistemas PAL.

<figure><img src="/files/xI72NV9a1Wo2zt8Ds0cx" alt="2A03 vs 6502"><figcaption></figcaption></figure>

<figure><img src="/files/EL1u2nSJfotoMXstCyiQ" alt="6502" width="375"><figcaption></figcaption></figure>

El **MOS 6502** es un **microprocesador de 8 bits** lanzado en 1975, famoso por su **simplicidad, bajo coste y eficiencia**.

A nivel técnico breve:

* **Arquitectura:** 8 bits de datos, 16 bits de direccionamiento (hasta 64 KB de memoria).
* **Registros:** Acumulador (A), dos registros índice (X, Y), stack pointer (S), program counter (PC) y status (P).
* **Modo de direccionamiento:** Soporta múltiples modos (inmediato, absoluto, indirecto, relativo…).
* **Ciclo de reloj:** Generalmente 1–7 ciclos por instrucción, sin pipeline complejo ni caché.
* **Uso histórico:** Base de CPUs en consolas como NES (2A03), Atari 2600, Commodore 64 y Apple I/II.

<figure><img src="/files/8IxSZvTJ2JrIO69FXkk4" alt=""><figcaption></figcaption></figure>

La CPU de la NES, no es un 6502 puro, es una adaptación para la NES, que incluye ademas **APU** (Audio Processing Unit).

| Característica         | MOS 6502 | Ricoh 2A03/2A07      |
| ---------------------- | -------- | -------------------- |
| Modo decimal "BCD"     | ✔️       | ❌                    |
| Instrucciones ilegales | ✔️       | ⚠️ Parcial           |
| Clock fijo             | ✔️       | ❌ (derivado del PPU) |
| APU integrada          | ❌        | ✔️                   |
| Uso standalone         | ✔️       | ❌                    |

La CPU de la NES se le ha eliminado el modo **Binary-Coded Decimal** (BCD) incluido originalmente en el 6502.\
\
Algunas características que diferencian de un 6502

* El **flag D (Decimal)** existe
* Las instrucciones `SED` y `CLD` **funcionan**
* Pero el hardware **BCD** está físicamente eliminado

\
El `BCD` permite la codificación de cada dígito decimal de un número como un binario separado de 4 bits. El 6502 usa palabras de 8 bits – lo que significa que cada palabra almacena dos dígitos decimales.

Como curiosidad, el número decimal `24` se representa como:

* Binario: `00110010 00110100`
* BCD: `0010 0100`

{% hint style="info" %}
En **BCD (Binary-Coded Decimal)** cada dígito decimal se codifica por separado en 4 bits.
{% endhint %}

la **NES utiliza un cristal de cuarzo** para generar el reloj principal, y **varía según la región** (NTSC o PAL). A nivel técnico, esto afecta **CPU, PPU y APU**, porque todos derivan su reloj de ese cristal.

<figure><img src="/files/FOzs8bos5o2xutFx57JC" alt=""><figcaption></figcaption></figure>

| Región | Frecuencia        | Función                                                          |
| ------ | ----------------- | ---------------------------------------------------------------- |
| NTSC   | **21.47727 MHz**  | Reloj para PPU y CPU/3.579545 MHz derivado para CPU/APU          |
| PAL    | **26.601712 MHz** | Reloj, derivado a 4.43361875 MHz para PPU y 1.662607 MHz CPU/APU |

\
**Derivación de reloj para la CPU**

* NTSC: CPU ≈ **1.789773 MHz**
  * Derivado del cristal maestro / 12
* PAL: CPU ≈ **1.662607 MHz**
  * Derivado del cristal maestro / 16

Esto significa que **juegos NTSC en PAL se ejecutan más lentos** (\~7 %), y la música suena más grave si no se adapta.

**Derivación de reloj para la PPU**

* NTSC: PPU ≈ **5.369318 MHz**
* PAL: PPU ≈ **5.320342 MHz**

PPU = cristal maestro / 4 en NTSC, / 5 en PAL (aproximadamente, depende de la división interna exacta del ASIC 2C02/2C07).

* Esto afecta el **frame rate**:
  * NTSC: 262 scanlines × 341 ciclos ≈ **60.1 Hz**
  * PAL: 312 scanlines × 341 ciclos ≈ **50.0 Hz**

| Sistema | Scanlines | Ciclos/frame | PPU clock    | Frame rate |
| ------- | --------- | ------------ | ------------ | ---------- |
| NTSC    | 262       | 89.342       | 5.369318 MHz | \~60.1 Hz  |
| PAL     | 312       | 106.392      | 5.320342 MHz | \~50 Hz    |

\
Convertir ciclos → frecuencia (Hz)

<figure><img src="/files/5VXGZva6GODt5CaMjeki" alt="" width="491"><figcaption></figcaption></figure>

**Implicaciones**

1. **Compatibilidad de software**
   * Juegos NTSC corren más lento en PAL si no hay conversión.
2. **Audio**
   * La frecuencia de la APU cambia con el reloj, afectando música y efectos.
3. **Timing exacto**
   * Juegos que dependen de ciclo a ciclo (sprites, scroll, glitches) se ven afectados por la frecuencia del cristal.

{% hint style="warning" %}
Las implicaciones sólo se aplican cuando la consola tiene la modificación de region free para poder jugar a juegos NTSC en consolas PAL o viceversa, en consolas sin modificación, no afecta. ya que no es posible ejecutar un juego NTSC en consola PAL o viceversa.\
\
[Como hacer el mod de region free](/readme-1/region-free-sin-cortar-el-cic)
{% endhint %}

**Bus de direcciones**

* **16 bits** → 64 KB direccionables
* Espacio mapeado por hardware NES

```asm
$0000–$07FF  RAM interna (2 KB)
$0800–$1FFF  Mirrors RAM
$2000–$2007  PPU registers
$4000–$4017  APU + I/O
$4020–$FFFF  Cartucho
```

**Pinouts:**

```bash
          ____  ____
         |*   \/    |
ROUT  <01]          [40<  VCC
COUT  <02]          [39>  $4016W.0
/RES  >03]          [38>  $4016W.1
A0    <04]          [37>  $4016W.2
A1    <05]          [36>  /$4016R
A2    <06]          [35>  /$4017R
A3    <07]          [34>  R/W
A4    <08]          [33<  /NMI
A5    <09]          [32<  /IRQ
A6    <10]   CPU    [31>  PHI2
A7    <11]          [30<  ---
A8    <12]          [29<  CLK
A9    <13]          [28]  D0
A10   <14]          [27]  D1
A11   <15]          [26]  D2
A12   <16]          [25]  D3
A13   <17]          [24]  D4
A14   <18]          [23]  D5
A15   <19]          [22]  D6
VEE   >20]          [21]  D7
         |__________|
```

**Variantes de la CPU (oficiales)**

| CPU              | REGION | FECHA             |
| ---------------- | ------ | ----------------- |
| RP2A03 (E, G, H) | NTSC   | 1983-06 / 2002-11 |
| RP2A07           | PAL    | 1987-03 / 1990-04 |
| RP2A07A          | PAL    | 1991-06 / 1992-10 |

Diagrama

<figure><img src="/files/Sq2YOn7ZfwpsxXW7kh8E" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/D8vKOqXBKZ6MLmPZ5IcU" alt=""><figcaption></figcaption></figure>

[Ver foto en alta reolucion](https://upload.wikimedia.org/wikipedia/commons/5/5a/Nintendo-NES-Mk1-Motherboard-Top.jpg)

#### **PPU:**

La **PPU** (Picture Processing Unit) de la NES es el **chip de vídeo** encargado de **generar la imagen en tiempo real**.<br>

* Funciona **independiente de la CPU**, con su **propio reloj y bus**
* Lee **tiles y atributos** desde **CHR-ROM/RAM** y **VRAM**
* Compone cada píxel **ciclo a ciclo** mediante registros de desplazamiento
* Gestiona **scroll, paletas y sprites (OAM)**
* Produce directamente la **señal de vídeo compuesta**

La CPU **no dibuja píxeles**:\
solo **configura registros**, y la PPU hace el renderizado **por hardware**, línea a línea, **sin framebuffer**.

<figure><img src="/files/1PfGqhsUgI3HCMFAD1N2" alt="" width="563"><figcaption></figcaption></figure>

| PPU            | Región | Clock        | Frame rate | Scanlines |
| -------------- | ------ | ------------ | ---------- | --------- |
| **Ricoh 2C02** | NTSC   | 5.369318 MHz | 60Hz       | 262       |
| **Ricoh 2C07** | PAL    | 5.320342 MHz | 50Hz       | 312       |

Espacio de direcciones PPU (14 bits)

La PPU direcciona **16 KB**:

```asm
$0000–$3FFF (PPU address space)
```

{% hint style="info" %}
La CPU NO accede directamente a VRAM, todo pasa por la **PPU** (2C02 NTSC / 2C07 PAL)
{% endhint %}

**Registros PPU (lado CPU):**

| Dirección | Registro  | Descripción         | Efectos especiales / notas                                                            |
| --------- | --------- | ------------------- | ------------------------------------------------------------------------------------- |
| `$2000`   | PPUCTRL   | Control general PPU | Define NMI, base NameTable, incremento de VRAM (1/32)                                 |
| `$2001`   | PPUMASK   | Máscara / render    | Activa BG/sprites, brillo, clip de borde                                              |
| `$2002`   | PPUSTATUS | Estado PPU          | VBlank, sprite 0 hit, sprite overflow; **leer limpia VBlank y resetea latch interno** |
| `$2003`   | OAMADDR   | Dirección OAM       | Dirección de 0–255 para sprites                                                       |
| `$2004`   | OAMDATA   | Datos OAM           | Escritura/lectura de 4×64 bytes de sprites                                            |
| `$2005`   | PPUSCROLL | Scroll              | 2 escrituras: X fina, Y fina; latch interno                                           |
| `$2006`   | PPUADDR   | Dirección VRAM      | 2 escrituras: alto, bajo; latch interno                                               |
| `$2007`   | PPUDATA   | Datos VRAM          | Lectura retardada (excepto paletas); auto-incremento según PPUCTRL                    |
| `$4014`   | OAMDMA    | DMA OAM             | Copia 256 bytes de CPU→OAM; **bloquea CPU 513 ciclos**                                |

{% hint style="info" %}

* `$2000–$2007` se repite cada 8 bytes en `$2008–$3FFF`.
* Acceso a VRAM solo seguro en VBlank o con render apagado.
  {% endhint %}

En la NES, **VRAM** se refiere **exclusivamente** a la **memoria de NameTables** usada por la PPU.

* **Tamaño real**: **2 KB de SRAM**
* **Tipo**: RAM estática
* **Ubicación**: dentro de la consola\
  (o en el cartucho en modo *four-screen*)
* **Accesible solo por la PPU**
* La CPU **nunca** accede directamente

{% hint style="info" %}
CHR-ROM/RAM no es VRAM
{% endhint %}

#### **Memoria WRAM:** <a href="#memoria" id="memoria"></a>

Tanto el Ricoh 2A03 y el MOS 6502 contienen un **bus de datos de 8 bits** y un **bus de direcciones de 16 bits**, lo que les permitía acceder hasta a **64KB de memoria**. Entonces, ¿cómo llenó Nintendo ese espacio de memoria?

Por un lado, la tarjeta madre contiene un chip que otorga **2 KB de RAM estática** (SRAM)\
Nintendo llama esta área «**Work RAM**» (WRAM) y puede usarse para almacenar:

* Variables para manejar el estado del juego y/o para buscar información.
* La «pila», la cual temporalmente guarda los valores de registros mientras que el procesador ejecuta subrutinas.
* Un «área de búfer» para que el procesador pueda copiar datos grandes entre dos ubicaciones.

**Comparación entre WRAM vs VRAM:**

| Aspecto    | WRAM     | VRAM                 |
| ---------- | -------- | -------------------- |
| Tamaño     | 2 KB     | 2 KB (NameTables)    |
| Acceso CPU | Directo  | Indirecto            |
| Mirroring  | Simple   | Dependiente cartucho |
| Ciclos     | 1 ciclo  | Varios + latencias   |
| DMA        | Sí (OAM) | No                   |
| Uso        | Lógica   | Vídeo                |

**Uso de memoria mapeada**

| Dirección     | Área                                           |
| ------------- | ---------------------------------------------- |
| `$0000–$07FF` | WRAM 2 KB                                      |
| `$0800–$1FFF` | Mirrors WRAM                                   |
| `$2000–$2007` | PPU registers                                  |
| `$2008–$3FFF` | Mirrors PPU registers cada 8 bytes             |
| `$4000–$4017` | APU y I/O                                      |
| `$4018–$401F` | Test / funciones especiales (usadas raramente) |
| `$4020–$FFFF` | Cartucho (PRG-ROM, mappers)                    |

**Acceso CPU → VRAM (registros PPU)**

| Registro  | Dir   |
| --------- | ----- |
| PPUCTRL   | $2000 |
| PPUMASK   | $2001 |
| PPUSTATUS | $2002 |
| OAMADDR   | $2003 |
| OAMDATA   | $2004 |
| PPUSCROLL | $2005 |
| PPUADDR   | $2006 |
| PPUDATA   | $2007 |

#### **APU:**

La **APU (Audio Processing Unit)** de la NES es el **chip de sonido integrado en la CPU 2A03/2A07** que genera todo el audio de la consola.

A nivel técnico:

* Tiene **5 canales de audio**: 2 cuadrados (pulse), 1 triángulo, 1 ruido, 1 DMC (delta modulation).
* Cada canal tiene **timers, envelopes y counters** que producen tonos, percusión y samples simples.
* La CPU controla la APU a través de **registros mapeados (**`$4000–$4017`**)**.
* El **frame counter** sincroniza la actualización de todos los canales, y el DMC puede **robar ciclos a la CPU** durante la reproducción de samples.
* La salida final se mezcla mediante un **circuito analógico interno**, produciendo la característica distorsión y volumen no lineal de la NES.

**Registros APU / I/O (CPU-mapeados)**

| Dirección     | Registro                 | Descripción                         | Detalles                                                  |
| ------------- | ------------------------ | ----------------------------------- | --------------------------------------------------------- |
| `$4000–$4003` | Pulse 1                  | Control, duty, sweep, length, timer | Duty 12.5–75%; sweep complementos 1 o 2; length counter   |
| `$4004–$4007` | Pulse 2                  | Igual que Pulse 1                   | Sweep negativo distinto                                   |
| `$4008–$400B` | Triangle                 | Linear counter, length, timer       | No envelope, amplitud fija 0–15                           |
| `$400C–$400F` | Noise                    | LFSR, period, envelope, length      | Modo largo/corto, ruido percusión                         |
| `$4010–$4013` | DMC                      | Delta modulation PCM                | DMA bytes desde $8000–$FFFF, 4 ciclos CPU por byte        |
| `$4015`       | APU status / control     | Enable canales, flags IRQ           | Lectura limpia IRQ DMC, lectura actual de length counters |
| `$4016`       | Joypad 1                 | Lectura / escritura                 | Latch strobe, lectura bit a bit                           |
| `$4017`       | Joypad 2 / Frame Counter | Lectura / escritura                 | Frame counter 4/5-step, IRQ inhibit                       |

{% hint style="info" %}

* `$4015` resetea length counters al escribir.
* `$4017` define timing de la APU, crítico para música.
  {% endhint %}

#### Lockout

* Es un **chip de 10 pines** dentro de la NES (2C02 / 2C07 CPU no incluido).
* Su nombre oficial: **CIC (Nintendo “Checking Integrated Circuit”)**.
* Funciona como **autenticador de cartuchos**: la consola solo arranca si detecta un cartucho con un **CIC compatible**.
* Cada región tenía **versiones distintas** (NTSC, PAL, JAP).

<figure><img src="/files/YcGvrMxpIUuXNSf2Bat9" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/mlyzCLBnHUW1kTyou27j" alt=""><figcaption></figcaption></figure>

\
En construcción


# 8bitdo DIY en mando original

<figure><img src="/files/m3dFRtHmEZlCglRznimu" alt=""><figcaption></figcaption></figure>

{% embed url="<https://shop.8bitdo.com/products/8bitdo-mod-kit-for-original-nes-controller-old-edition?variant=42000475717809>" %}
Para los mandos de la Nintendo NES original
{% endembed %}

{% embed url="<https://shop.8bitdo.com/products/8bitdo-mod-kit-for-nes-classic-edition-controller-new-edition>" %}
Para los mandos de la Nintendo NES Mini
{% endembed %}

<figure><img src="/files/9G2BmKVeWmRGzLebyPoG" alt=""><figcaption><p>Caja simple, junto al receptor de la NES</p></figcaption></figure>

<figure><img src="/files/l8ZJjvYSVghWMWWPWtdA" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/nm2aH5qvMwXLTKe36Klq" alt=""><figcaption><p>Nos incluye la PCB con su batería, el conector de carga, destornillador y cable usb de carga, la bolsa electroestática es enorme, sirve para guardar la PCB y cable de la placa original del mando</p></figcaption></figure>

<figure><img src="/files/AREW7080wfnsihViVLdg" alt=""><figcaption><p>Mando original</p></figcaption></figure>

<figure><img src="/files/UxCWVdxn61RJLV2PfCcY" alt=""><figcaption><p>Solo debemos quitar los 6 tornillos</p></figcaption></figure>

<figure><img src="/files/GZnmLVXOMoorghAaoJLq" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/BI09FPhB14LsbSoXdttZ" alt=""><figcaption><p>Vista de la placa base</p></figcaption></figure>

<figure><img src="/files/DjYc8ZVadnEvGn6IGkC5" alt=""><figcaption><p>Si tienes muy mal las gomas, aprovecha a cambiarlas ya de paso.</p></figcaption></figure>

<figure><img src="/files/p0xec8KlGdBEBTjb10lP" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/xGYMD8MJZTMLLemjsTMl" alt=""><figcaption><p>Levantamos la pestaña para conectar el puerto de carga</p></figcaption></figure>

<figure><img src="/files/Bd83Lg40RRiODx1Zmoso" alt=""><figcaption></figcaption></figure>

Aprovechando que tenemos la placa fuera, vamos a actualizar el firmware

<figure><img src="/files/OQO0zImCk6i0mBwiis5E" alt=""><figcaption><p>Cable USB no incluido, te vale cualquiera microUSB</p></figcaption></figure>

<figure><img src="/files/HYhNcCOfebdoDW106RSe" alt=""><figcaption><p>Conectado, se ilumina en varios colores y luego se queda en luz azul fijo</p></figcaption></figure>

Nos descargamos el software de actualización del firmware desde la web de 8bitdo

{% embed url="<https://support.8bitdo.com/firmware-updater.html>" %}

<figure><img src="/files/8Bh6knRcDosOGyET7A2V" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/kLIzxC5rHJji8rxCFoJV" alt=""><figcaption><p>En nuestro caso, no es necesario actualizar, tenemos la ultima versión, también sirve para resetear el dispositivo</p></figcaption></figure>

Si quisiéramos actualizar, solo le damos a "**Update**"

<figure><img src="/files/Oc3qlMMWsCqv5jReK6Mj" alt=""><figcaption><p>Esperamos a que termine la actualización y desconectamos el cable USB</p></figcaption></figure>

Seguimos, colocamos el puerto de carga, mucho cuidado con el.

<figure><img src="/files/HUvk6iaIIhMGurEqxN17" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/Z1EtRBUIQycjABk8rI8G" alt=""><figcaption><p>PCB montada, solo queda colocar los tornillos de nuevo.</p></figcaption></figure>

<figure><img src="/files/gnyrU0rO5PRYTp1nXG1Z" alt=""><figcaption><p>Cargando el mando</p></figcaption></figure>


# Bluetooth interno con 8bitdo

Material necesario:

* Consola Nintendo NES
* Receptor bluetooth de 8bitdo
* Soldador de 15/45W aprox
* Estaño
* Flux
* Cableado

[8bitdo](https://www.8bitdo.com/retro-receiver-nes/) tiene un receptor para conectar y listo a la consola NES a uno de sus puertos.

<figure><img src="/files/USjcIUS1p0pjXTVf7UQJ" alt=""><figcaption></figcaption></figure>

Esta bien, pero... y porque no integrarlo dentro de la consola y dejamos el puerto libre?

Lo primero de todo, necesitamos el receptor de 8bitdo, y desmontarlo.

<figure><img src="/files/sJkRAKmbyrtKp0ZGi7OA" alt=""><figcaption></figcaption></figure>

Para abrirlo necesitaremos mucha paciencia si no queremos romper la carcasa, tiene 4 muescas que debemos meter un pincho e ir sacándolo lentamente.

<figure><img src="/files/LdeVdaHIYsHQLf1CPMzv" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/RL3Juv24YlYK8LtxSidq" alt=""><figcaption></figcaption></figure>

Cuesta, pero sale. Lo importante es tirar recto, no doblarlo, porque nos podemos cargar la pequeña PCB que tiene.

Una vez sin la carcasa, abrirmos los laterales.

<figure><img src="/files/8ouknKiPhEocqCwgX0Sh" alt=""><figcaption></figcaption></figure>

Vistas de la placa de cerca.

<figure><img src="/files/5jvUYYvvRXvBZeTMcLn8" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/qZCQCUuO5qmg3KuQwaxC" alt=""><figcaption></figcaption></figure>

Ya tenemos la PCB del receptor bluetooth, seria recomendable antes de instalarlo en la NES, actualizar el firmware desde la web de 8bitdo podemos descargarnos el software para actualizar el firmware.

{% embed url="<https://support.8bitdo.com/firmware-updater.html>" %}

Desmontaje de la consola.

<figure><img src="/files/bMifcBLTHur1DXuuKWzA" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/QZIf8remexY5WPytP7WI" alt=""><figcaption><p>Retiramos los 6 tornillos</p></figcaption></figure>

<figure><img src="/files/9hSkjeLXEeuTtG0BwPsP" alt=""><figcaption><p>Vista del chasis metalico, tiene 7 tornillos a su alrededor</p></figcaption></figure>

<figure><img src="/files/hyLzZVEXjnkj4t2y3qT2" alt=""><figcaption><p>Vista de la bandeja del cartucho</p></figcaption></figure>

<figure><img src="/files/ws7psvn4Now4ixTHFjja" alt=""><figcaption><p>Retiramos la bandeja, tiene 6 tornillos, los grises son los mas largos.</p></figcaption></figure>

<figure><img src="/files/TPBAubxwZfHTFEWRADd0" alt=""><figcaption><p>Retiramos los 2 tornillos del modulo RF</p></figcaption></figure>

<figure><img src="/files/t5KU5RKOzhZvXjl13Q1G" alt=""><figcaption><p>Vista de la placa base</p></figcaption></figure>

Ahora nos ponemos con la parte baja de la carcasa.

<figure><img src="/files/c9uSh9e5eAuYvMtg9DXl" alt=""><figcaption><p>Retiramos los 2 tornillos del frontal de los puertos</p></figcaption></figure>

<figure><img src="/files/nLscjlwmRpM0wcaYCmf6" alt=""><figcaption><p>Y ya podremos quitar el frontal</p></figcaption></figure>

<figure><img src="/files/JyFDIImsk8hz68NSeBht" alt=""><figcaption><p>Tornillo de la consola.<br>Idz a Drch.<br>Carcasa, chasis, bandeja, modulo RF y frontal de los puertos</p></figcaption></figure>

<figure><img src="/files/JqBDdhn9KyGCSpFLAXtW" alt=""><figcaption><p>Sacamos los puertos y su cableado</p></figcaption></figure>

Ahora debemos identificar los pines de la NES.

<figure><img src="/files/O2Ja5AXlyOF2lKVa4xB9" alt=""><figcaption></figcaption></figure>

Puntos donde debemos soldar la PCB de 8bitdo

<figure><img src="/files/rt963dxOGWg2l5yOfoN6" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/aOxwf0Li4jyXn6kXtNKk" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/RPICDS7tCe5pzYESvpE9" alt=""><figcaption><p>PCB de 8bitdo ya soldada a la PCB de la consola</p></figcaption></figure>

Ubicación donde lo puedes colocar, esto ya es al gusto de cada uno.

<figure><img src="/files/Ahiim18AXRShVeFsBvcZ" alt=""><figcaption></figcaption></figure>

Pruebas, se enlaza perfectamente con el mando, en este caso es un NES30 también de 8bitdo, pero puedes usar cualquier otro mando compatible.

<figure><img src="/files/MqvTNdzO3OZ40fwS6ify" alt=""><figcaption></figcaption></figure>

Ya solo queda cerrar y disfrutar, si tienes 2 receptores de 8bitdo, puedes colocar uno en cada puerto.

<figure><img src="/files/c7xqeQ79pMBdw899D9Jg" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/DLo7eH1YUmZoc5kGIrZZ" alt=""><figcaption></figcaption></figure>


# Región Free, sin cortar el CIC

Sistema de autentificación de Nintendo, llamado [10NES](https://es.wikipedia.org/wiki/10NES), desarrollado para verificar los juegos y los periféricos originales.\
\
En la NES, el **CIC** (10NES) funciona como un sistema de protección que asegura que solo se puedan ejecutar cartuchos compatibles con la región de la consola. Si se introduce un cartucho de una región diferente a la de la consola, el **LED de encendido parpadea**, indicando que el juego **no es compatible**. Este parpadeo no significa que el CIC haya autenticado el juego; simplemente señala que **el juego debe coincidir con la región de la consola** para poder ejecutarse correctamente.

{% hint style="info" %}
Introducir un juego de una región diferente a la de la consola, causa que el LED encendido de la consola parpadea y muestra pantalla gris en la TV.
{% endhint %}

<figure><img src="/files/uVc5p54wSJPPbs9Ft7oN" alt=""><figcaption></figcaption></figure>

Hay varias formas de anular el chip, la mas común y mas bestia, cortar la patilla 4 del chip, bien dejándolo al aire o soldando un cable GND.

<figure><img src="/files/wCytXE8PxhEvIQGQrW7e" alt=""><figcaption><p>Identificación de la patilla 4</p></figcaption></figure>

<figure><img src="/files/aZEE1j4v7N5CiNqZm4cj" alt=""><figcaption><p>Dejando al aire la patilla</p></figcaption></figure>

<figure><img src="/files/1wqnsrVQYVH5kvxpkmqw" alt="" width="375"><figcaption><p>Soldando un cable, del pin 4 al pin 13</p></figcaption></figure>

la otra es retirar el chip... en placas como [OpenTendo](https://github.com/Redherring32/OpenTendo) o [SMTendo](https://github.com/zaxour/OpenTendo-SMTendo) no llevan el CIC.\
\
Pero la menos conocida, es además la reversible, el chip lo dejamos tal cual sin tocar, desmontalos la consola para acceder a la placa base y tan solo necesitamos soldar 2 cables como se aprecian en las fotos que adjunto.

Solamente necesitamos un soldador de unos 30/45W, estaño, flux para facilitar la soldadura y 2 cables.

<figure><img src="/files/t5KU5RKOzhZvXjl13Q1G" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/akZn2mRhfRwzfabbOXgG" alt="Puntos a soldar"><figcaption></figcaption></figure>

<figure><img src="/files/YS7TpRvvZMjfuZeSsA2S" alt=""><figcaption><p>Vista con la consola montada.</p></figcaption></figure>

Solamente eso, nada mas.\
\
Ya podremos cargar juegos de otras regiones ejemplo juego NTSC en consola PAL o vicecersa, sin que el CIC nos de problemas, ademas es reversible por si decidimos volver al estado original la consola solo hay que quitar esos 2 cables y la consola queda intacta.\
\
Se recomienda limpia los contactos de la consola y cartucho con alcohol isopropilico.

{% hint style="info" %}
Si tu consola es PAL (50Hz), los juegos en NTSC irán igualmente a 50Hz, no a 60Hz, y viceversa.
{% endhint %}


# PlayStation


# Instalar HDD-OSD

**Requisitos Hardware:**

* PlayStation 2 (fat)
* MemoryCard
* Adaptador de Red oficial SCPH-10350 / SCPH-10281 (*compatible con adaptadores de red de no oficiales*)
* Disco Duro IDE si no tienes el mod de SATA, recomendable el de BitFunx
* Disco Duro SATA, válidos algunos SSD, max. 2Tb

**Requisitos Software:**

* [HDD-OSD 1.00J](https://archive.org/details/hddosd-100j-update-110u-48bit-atadp)
* [wLaunchELF ISR](https://github.com/israpps/wLaunchELF_ISR/releases)
* [Open PS2 Loader](https://github.com/ps2homebrew/Open-PS2-Loader/releases)

Mi hardware es:

* PlayStation 2 v7 SCPH-39004 (también una v9 SCPH-50004)
* Adaptador de red oficial de Sony, SCPH-10350\
  ![](/files/HYL6WPlZQoZT2aQykI80)![](/files/6kGukNwsJmg5En9idReV)
* [Adaptador SATA de BitFunx](https://es.aliexpress.com/item/33060033230.html)\ <img src="/files/x1PB5VP1Gee6RiAvuXso" alt="" data-size="original">
* HDD [Western Digital WD5000AZLX](https://www.amazon.es/dp/B00E1C93L0) de 500Gb 3.5", mas que de sobra, a no ser que quieras tener casi todo el FullSet.\
  ![](/files/QrM1IoTUziSjDxaV4P8m)<br>

\
Tenemos 2 .img RAW para grabar en el HDD:

`HDDOSD_100J_ATADP_DTL-H_FIX_48BIT_APPS.IMG` - md5: `83e5f2b624b18d28c2c912663c48c370`\
`HDDOSD_100J_ATADP_DTL-H_FIX_48BIT.IMG` - md5: `952410e5a31b9ceb3a998b2d59735cfb`\
\
con apps que incluye unas versiones algo obsoletas de uLaunchELF y OPL, o sin apps, limpio completamente, solo el hdd-osd formateado, sin aplicaciones, me gusta más esta segunda opción, para dejarlo a tu gusto, requiere de un método como [FreeMCBoot](/playstation/freemcboot) para cargar el uLaunchELF inicialmente y crear las particiones:

* `PP.ULE` Partición para el uLaunchELF, config y ejecutable .kelf, tamaño 128Mb.
* `PP.OPL` Partición para el OPL, config y ejecutable .kelf, tamaño 128Mb.
* `+OPL` la partición "+OPL" la crea el OPL la primera vez que se inicia, en caso contrario, crearla a mano, max 2Gb.
* `__.POPS` Partición para los juegos de PSX en formato .VCD

{% hint style="info" %}
El orden es importante para que el OPL cargue más rápido, de lo contrario tardará más en cargarse si hay juegos de PS2 que se instalaron antes de crear la partición `+OPL`.\
\
Asimismo la partición `__.POPS` para el emulador de PSX debe crearse justo después de haber creado la partición `+OPL`, y por último empezar a instalar los juegos de PS2 con HDL-Batch-installer.
{% endhint %}

\
Conectamos nuestro HDD o SSD al ordenador, bien por cable SATA o USB en una caja (IDE/SATA), tenemos que conocer la letra del dispositivo, `/dev/sdb` por ejemplo.

```bash
sudo dd if=HDDOSD_100J_ATADP_DTL-H_FIX_48BIT.IMG of=/dev/sdb bs=1M status=progress conv=fsync
```

\
Una vez terminado, ya hemos acabado de momento con el HDD, lo conectamos al adaptador de red de la PS2 y lo metemos en la consola, asegúrate que queda bien conectado, no es necesario atornillar aun los 2 tornillos, además se pasan enseguida las roscas del lado de la consola, para restaurar la rosca tienes que desmontar la consola, quitar el chasis...

En construcción...


# Review Cable SCART RGB C-SYNC

Cable RGB C-SYNC de RGC UK con chip LM1881

<figure><img src="/files/3DRffMr6bBDRsn0rMZi4" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/xqxgkG9EMaCSrZM0aO8Q" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/59rHCoKWPLk6siIkKVGN" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/2eQ5lJRzFAR93tQA9q0q" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/ltF5QoAhCvig3xTYNE2V" alt=""><figcaption></figcaption></figure>

[Cable RGB CSYNC para Playstation 1 ](https://www.retrogamingcables.co.uk/sony-av-accessories/PlayStation-1-RGB-SCART-CABLES/SONY-PLAYSTATION-CSYNC-COMPOSITE-SYNC-RGB-SCART-WTH-LIGHT-GUN-PORT)(valido para Playstation 2)

El chip LM1881 toma una "sincronización sobre sincronización de video compuesto" (HSYNC+VSYNC+CVBS) y elimina el aspecto de video compuesto (CVBS) de la señal, y emite CSYNC (HSYNC+VSYNC), que es la señal de sincronización más limpia disponible cuando se usa un cable SCART RGB. Esto puede ayudar a eliminar artefactos en pantalla no deseados y también puede ser necesaria una señal CSYNC para algunos monitores que solo aceptan CSYNC.

La salida de este LM1881 tiene una resistencia de 470 Ω para que la señal CSYNC sea adecuada para un funcionamiento de 75 ohmios.\
\
![](/files/bIiku4AWfBoXpvkpKaTh) ![](/files/mPmMYhBqRjwTDwLmYxtW)

[Datasheet LM1881](https://www.ti.com/lit/ds/symlink/lm1881.pdf)


# FreeMCBoot

<figure><img src="/files/NlTBVtrL1p4WmCcl3bdN" alt=""><figcaption></figcaption></figure>

Free McBoot es un exploit que reemplaza el menú principal de tu PS2 sin tener que modificarla físicamente y permite usar homebrews, se instala en la Memory Card (oficial a ser posible)

Lista de versiones del FMCB incluidas en el .7z:

* FreeMCBoot v1.966
* uLaunchELF v4.43a
* ESR r9b
* HD-Loader 0.8c
* Open PS2 Loader v1.1.0
* PS2-Reality 1.5 Pro

📦[Descargar FMCB v1.966](https://mega.nz/file/1BoHnDRZ#xWOI2RTTzgJTYDQB96gapxA1G-aX_3ooN-MIo5Nllug)

Es posible añadir mas opciones al menú, para ello debemos editar el fichero\
`SYS-CONF/FREEMCB.CNF` y nos encontraremos con esto.

```shell
# ----------------------------------------
# Free MCBoot Config File
# must be in mc?:/SYS-CONF/FREEMCB.CNF or mass:/FREEMCB.CNF
# ----------------------------------------
CNF_version = 1
# ----------------------------------------
Debug_Screen = 0
FastBoot = 0
ESR_Path_E1 = mass:/PS2/BOOT/ESR.ELF
ESR_Path_E2 = mc?:/BOOT/ESR.ELF
ESR_Path_E3 =
pad_delay = 0
LK_Auto_E1 = OSDSYS
LK_Circle_E1 = OSDSYS
LK_Cross_E1 = OSDSYS
LK_Square_E1 = OSDSYS
LK_Triangle_E1 = OSDSYS
LK_L1_E1 = mass:/PS2/BOOT/HDLOADER.ELF
LK_L1_E2 = mc?:/APPS/HDLOADER.ELF
LK_L1_E3 = 
LK_R1_E1 = mass:/PS2/BOOT/BOOT.ELF
LK_R1_E2 = mc?:/BOOT/BOOT.ELF
LK_R1_E3 = 
LK_L2_E1 = mass:/PS2/BOOT/PS2REALITY.ELF
LK_L2_E2 = mc?:/APPS/PS2REALITY.ELF
LK_L2_E3 = 
LK_R2_E1 = mass:/BOOT/ESR.ELF
LK_R2_E2 = mc?:/BOOT/ESR.ELF
LK_R2_E3 = 
LK_L3_E1 = OSDSYS
LK_R3_E1 = OSDSYS
LK_Up_E1 = OSDSYS
LK_Down_E1 = OSDSYS
LK_Left_E1 = OSDSYS
LK_Right_E1 = OSDSYS
LK_Start_E1 = mc?:/SYS-CONF/FMCB_CFG.ELF
LK_Start_E2 = OSDSYS
LK_Select_E1 = OSDSYS
hacked_OSDSYS = 1
OSDSYS_video_mode = AUTO
OSDSYS_Skip_Logo = 0
OSDSYS_Skip_Disc = 0
OSDSYS_Inner_Browser = 0
OSDSYS_selected_color = 0x10,0x80,0xE0,0x80
OSDSYS_unselected_color = 0x33,0x33,0x33,0x80
OSDSYS_scroll_menu = 0
OSDSYS_menu_x = 425
OSDSYS_menu_y = 175
OSDSYS_enter_x = 175
OSDSYS_enter_y = -1
OSDSYS_version_x = -1
OSDSYS_version_y = -1
OSDSYS_cursor_max_velocity = 1000
OSDSYS_cursor_acceleration = 100
OSDSYS_left_cursor = o009
OSDSYS_right_cursor = o008
OSDSYS_menu_top_delimiter =
OSDSYS_menu_bottom_delimiter =
OSDSYS_num_displayed_items = 5
OSDSYS_Skip_MC = 1
OSDSYS_Skip_HDD = 1
name_OSDSYS_ITEM_1 = Explorador de archivos
path1_OSDSYS_ITEM_1 = mc?:/BOOT/BOOT.ELF
path2_OSDSYS_ITEM_1 = mass:/PS2/BOOT/BOOT.ELF
name_OSDSYS_ITEM_2 = Juegos
path1_OSDSYS_ITEM_2 = mc?:/APPS/OPNPS2LD.ELF
path2_OSDSYS_ITEM_2 = mass:/PS2/BOOT/OPNPS2LD.ELF
```

Hay varias opciones que cambian el comportamiento de la consola al iniciarla o al iniciar un juego.

fastboot, por defecto en 1, al cambiarla a 0, hacemos que la consola cargue normalmente la animación de inicio, si la dejáramos en 1, el arranque es mas rápido al no cargar la animación.

```sh
FastBoot = 0
```

Estos parámetros, es muy parecido al anterior, cuando cargas un juego aparece la animación "playstation 2" que es un método de validación por cierto donde lo comentare en otro punto, por defecto en 1, eso no aparece.

```sh
OSDSYS_Skip_Logo = 0
OSDSYS_Skip_Disc = 0
```

Estas opciones son las que debemos modificar si queremos colocar los textos en pantalla del menú principal.

el primer parámetro, le decimos que no queremos scroll definiendo el valor a 0 (por defecto 1), los siguientes parámetros son coordenadas. por defecto las coordenadas son:

```sh
OSDSYS_menu_x = 320
OSDSYS_menu_y = 110
OSDSYS_enter_x = 30
```

Al dejarlo así, tenemos los textos de las opciones y sin scroll, mas OEM.

```sh
OSDSYS_scroll_menu = 0
OSDSYS_menu_x = 425
OSDSYS_menu_y = 175
OSDSYS_enter_x = 175
```

Estas lineas, que no contienen valor algunos, son las que añaden la versión en amarillo, el nombre de freemcboot, etc...<br>

Así seria por defecto.\
Vemos el titulo de "Free MCBoot", la versión \[Version xxxxxx], vemos unas flechas que parpadean en ambos lados de las opciones, ademas de los botones en cada extremo de la pantalla.

<figure><img src="/files/SIxqsjNMG56KM2OlHqOz" alt=""><figcaption></figcaption></figure>

```
OSDSYS_menu_top_delimiter = y-99FreeMcBoot              c0[r0.80Version %VER%r0.00]y-00
OSDSYS_menu_bottom_delimiter = c0r0.60y+99Use o006/o007 to browse listy-00r0.00
```

y así un menú limpio, como es la consola originalmente pero añadiendo nuevas opciones sin romper la estética original.

<figure><img src="/files/AzBLQjxJuUWGxDXmlfwd" alt=""><figcaption><p>OSD</p></figcaption></figure>

```sh
OSDSYS_menu_top_delimiter =
OSDSYS_menu_bottom_delimiter =
```

En esta parte definimos las opciones que se mostraran en el OSD de la consola.

```
name_OSDSYS_ITEM_1 = Explorador de archivos
path1_OSDSYS_ITEM_1 = mc?:/BOOT/BOOT.ELF
path2_OSDSYS_ITEM_1 = mass:/PS2/BOOT/BOOT.ELF
name_OSDSYS_ITEM_2 = Juegos
path1_OSDSYS_ITEM_2 = mc?:/APPS/OPNPS2LD.ELF
path2_OSDSYS_ITEM_2 = mass:/PS2/BOOT/OPNPS2LD.ELF
```

**mc?**, es una variable donde le decimos que busque en cualquier slot de las tarjetas de memoria, podríamos concretarlo poniendo **mc0** o **mc1**.\
\
**mass**, es el almacenamiento externo por USB conectado a la consola, el formato de archivos por defecto debe ser FAT32, aunque hay un uLauncheELF modificado que aceptar ExtFAT.

Tenemos otras variables como **hdd0:**&#x70;artición , ejemplo **hdd0:\_\_sysconf**, en este caso le decimos que busque en el HDD instalado si lo tenemos en la partición \_\_sysconf el .elf a cargar.

También **cdfs**, que seria la unidad DVD de la consola y **host** seria buscar en la red


# Instalación chip PSX, PU-20

**Diagrama de instalación del chip 12C508A para la Playstation SCPH-7002 con placa PU-20**

Necesitamos grabar el código .hex en el chip 12c508a, podemos grabar la versión normal "*modchip\_12c508a.hex*" o el modo stealth "*stealth\_12c508a.hex*" para juegos japoneses.

![](/files/3RUTFwpUlwQiEttosTzj)

Desmontamos la consola, retirando los 6 tornillos de la carcasa.

<figure><img src="/files/jOK3mvtJPOSEWz0pn8TL" alt=""><figcaption></figcaption></figure>

Localizamos el área de la placa donde vamos a colocar el chip

<figure><img src="/files/AafuL40JhPAdMGpepL9i" alt=""><figcaption></figcaption></figure>

**Puntos a soldar**<br>

* Instalación\
  [modchip\_12c508a.hex](https://raw.githubusercontent.com/AzagraMac/PSX-modchip/master/modchip_12c508a.hex)

<figure><img src="/files/sz76lMA5JJMapENxODMY" alt=""><figcaption></figcaption></figure>

* Instalación\
  [stealth\_12c508a.hex](https://raw.githubusercontent.com/AzagraMac/PSX-modchip/master/stealth_12c508a.hex)

<figure><img src="/files/SIy8pF5F4ZgnmRM21X2g" alt=""><figcaption></figcaption></figure>

***Notas***

* Modo Dino pulsar reset 3 seg
* una pulsación mas de reset para cambiar otro modo, hay 10 "Dino Modes", esto no es necesario para los modelos 750x/9xxx
* se desactiva al pulsar reset 11 veces, apagar con power se activa
* Si se quiere poner un LED, en la patilla 3
* Repasar las soldaduras a la inversa, ten cuidado de no calentar mucho el chip ya que lo puedes quemar.

:warning: *La modificación de la consola, anula cualquier garantía que pudiera tener, y solo es responsable el propietario de la consola, el uso de copias de juegos ilegales no es legal en muchos países, este tutorial se ha realizado a modo informativo, el autor no se hace responsable del mal uso que se le pueda dar.*


# Ubiquiti


# Unboxing Cloud key Gen 2 Plus

Link Store: <https://eu.store.ui.com/collections/unifi-accessories-cloud-key/products/unifi-cloudkey-gen2-plus>

![](/files/y1VpHKvFnP7e0Ivtw3N7) ![](/files/lRG6omatHDW0JImoKfAe) ![](/files/6rYXELKFFAQl1W8fQyGh) ![](/files/FaOIhmuxpRil8aZGEL9C) ![](/files/RJMnrValUCV5Ajd2UMSF)


# UniFi Controller en Docker

Se puede desplegar UniFi Controller, desde el Cloud Key, o desde una aplicacion que instalas en la maquina en local, con versiones para MacOS, Linux y Win, pero... tambien puedes tenerlo en tu RaspberryPi por ejemplo, en una NanoPi...\
\
Si lo vamos a desplegar en una RaspberryPi por ejemplo, debemos instalar el servicio de docker previamente.

```
sudo apt update
sudo apt upgrade -y
sudo apt install -y libffi-dev libssl-dev python3 python3-pip
sudo curl -sSL https://get.docker.com | sh
sudo usermod -aG docker $USER
sudo apt install -y docker-compose
```

Si puedes, reiniciala despues de la instalacion.\
Bien ya tenemos docker en nuestra RaspberryPi, bienvenido al mundo de los contenedores.

Ahora vamos a descargar el repo con nuestro docker-compose para desplegar UniFi Controller.\
\
Entramos por ssh en nustra RaspberryPi y ejecutamos:

```bash
git clone https://github.com/AzagraMac/unificontroller-docker
```

Entramos en el repo

```
cd UnifiDocker
```

Tendremos un fichero docker-compose.yaml, si editamos el fichero...

```yaml
---
version: "2.1"
services:
  unifi-controller:
    image: linuxserver/unifi-controller:latest
    container_name: unifi-controller
    network_mode: host
    environment:
      - PUID=1000
      - PGID=1000
      - MEM_LIMIT=1024
      - MEM_STARTUP=1024
    volumes:
      - $HOME/docker/unifi:/config
    ports:
      - 3478:3478/udp
      - 10001:10001/udp
      - 8080:8080
      - 8443:8443
      - 1900:1900/udp
      - 8843:8843
      - 8880:8880
      - 6789:6789
      - 5514:5514/udp
    restart: unless-stopped

networks:
  unifi_net:
    driver: bridge
```

Podemos editar por ejemplo, el volumen donde queremos que se almacene de forma persistente los datos, en el ejemplo apunta a /root/docker/unifi, puedes cambiar eso por la ruta que deseas.

y para lanzarlo

```bash
docker-compose up -d
```

La primera vez que lo ejecutas, tiene que descargar la imagen de Unifi, actualmente la v6.5.55 (la ultima disponible a fecha del post)... tardar unos minutos.\
Podremos ver que funciona abriendo el navegador web y poniendo la ip de la raspberrypi

```bash
https://IP_Raspberry:8443
```

Y listo.

![](/files/RkutyPfLAjaOBFg3L11Z)

Versión actual: [![unifi](https://badgen.net/badge/UniFi/8.0.7-ls218?list=%7C\&icon=https://docs.golift.io/svg/ubiquiti_color.svg\&color=0099ee)](https://www.ui.com/download/unifi/)


# Abrir puertos en USG Security Gateway

Entorno:\
\- Unifi Controller v6.5.55\
\- USG Security Gateway, firmware v4.4.56

Entramos en nuestro UniFi Controller, y nos vamos a "Settings", en el menu lateral, una vez dentro, nos dirigimos al menu "Advanced Features", y en la parte derecha de la pantalla, "Advanced Gateway Settings"

![](/files/pCwpL5VWZxFwP7rPtbu9)

Una vez dentro, veremos varias opciones, click en "Create New Port Forwarding"

![](/files/bHtuLIm8rAoYEAxirbZo)

Ahora debemos rellenar el forulario, necesitaremos el puerto externo (el que estara visible desde internet), el interno que sera la maquina donde escuche, y la IP de la maquina y protocolo, TCP y/o UDP.

En "Name", ponemos el servicio que vamos a configurar, habilitamos la opcion "Enable Forward Rule" para que este disponible el puerto, si lo queremos deshabilitar, con desmarcar esa opcion, es suficiente, elegiremos el interface (por defecto WAN), puerto, IP, protocolo y si tenemos configurado una servicio de registro de log, podemos marcar la opcion para añadir el resultado de lo que pase por el servicio de log, ejemplo, rsyslog, kibana...

![](/files/L2EMXMXIpNurDJG57P1R)

Guardamos, y dejamos que aprovisione los cambios y ya tendremos listo el acceso.


# MAC del router HGU de Movistar en el USG

En este caso, no es estrictamente necesario para este operador (Movistar/O2), pero no esta demas conocerlo si se nos presenta el caso.\
\
Para ello necesitmos la MAC de nuestro router que nos facilita el ISP, es una numeracion hexadecimal tipo XX:XX:XX:XX:XX:XX.\
\
Ahora entramos por SSH al USG, las credenciales las tenemos en UniFi Controller, en *Settings / System / Application Configuration / Device SSH Authentication*

```
ssh USER@IP_USG
```

ya estamos en el USG, lo primero es sacarla informacion que tiene, comprobar el dispositivo, por defecto el WAN es el eth0, pero mejor asegurarse.

```
show configuration
```

Nos mostrara toda la configuracion en formato json, bajamos hasta que veamos un bloque asi:

```
interfaces {
    ethernet eth0 {
        description WAN
        vif 6 {
            description WAN
            firewall {
                in {
                    ipv6-name WANv6_IN
                    name WAN_IN
                }
                local {
                    ipv6-name WANv6_LOCAL
                    name WAN_LOCAL
                }
                out {
                    ipv6-name WANv6_OUT
                    name WAN_OUT
                }
            }
            pppoe 2 {
                default-route none
                firewall {
                    in {
                        ipv6-name WANv6_IN
                        name WAN_IN
                    }
                    local {
                        ipv6-name WANv6_LOCAL
                        name WAN_LOCAL
                    }
                    out {
                        ipv6-name WANv6_OUT
                        name WAN_OUT
                    }
                }
                name-server none
                password ****************
                user-id adslppp@telefonicanetpa
            }
        }
    }
```

Nos interesa conocer el numero de dispositivo de la WAN, lo tenemos en la linea 2 del bloque anterior.

Editamos la configuracion, para ello entramos en modo configuracion:

```
configure
```

Nos informara la consola que estamos en modo edicion asi, ten cuidado con lo que tocas!!!:

```
user@ubnt:~$ configure
[edit]
```

Para añadir la MAC del router del ISP, escribimos, donde ethX, ponemos el dispositivo de nuestra WAN, por defecto eth0, en XX:XX:XX:XX:XX:XX, la MAC del router del ISP:

```
set interfaces ethernet ethX mac XX:XX:XX:XX:XX:XX
```

validamos los cambios:

```
commit
```

Guardamos los cambios:

```
save
```

```
user@ubnt# save
Saving configuration to '/config/config.boot'...
Done
[edit]
```

salimos y reiniciamos el USG, despues nos volvemos a conectar por SSH y comprobamos que se han aplicado correctamente.

```
user@ubnt:~$ show configuration

...

interfaces {
    ethernet eth0 {
        description WAN
        duplex auto
        mac XX:XX:XX:XX:XX:XX
        speed auto
        vif 6 {
            description WAN
            firewall {
                in {
                    ipv6-name WANv6_IN
                    name WAN_IN
                }
                local {
                    ipv6-name WANv6_LOCAL
                    name WAN_LOCAL
                }
                out {
                    ipv6-name WANv6_OUT
                    name WAN_OUT
                }
            }
            pppoe 2 {
                default-route none
                firewall {
                    in {
                        ipv6-name WANv6_IN
                        name WAN_IN
                    }
                    local {
                        ipv6-name WANv6_LOCAL
                        name WAN_LOCAL
                    }
                    out {
                        ipv6-name WANv6_OUT
                        name WAN_OUT
                    }
                }
                mtu 1492
                name-server none
                password ****************
                user-id adslppp@telefonicanetpa
            }
        }
    }
```

Si nos fijamos en el bloque, en la linea 9, ya tenemos la MAC de nuestro router ISP, esto es todo.:thumbsup:


# Configurar USG Security Gateway para Movistar

Valido también para O2

Entorno:\
\- Unifi Controller v6.5.55\
\- USG Security Gateway, firmware v4.4.56

Entramos en nuestro UniFi Controller, y nos vamos a "Settings", en el menu lateral, una vez dentro, nos dirigimos al menu "Internet", y en la parte derecha de la pantalla, "Add Secondary Internet Connection"

![](/files/p1D6YVxN19hn4bVrDkjv)

Ahora rellenamos los datos.\
\
En NAME, pondremos el nombre del servicio, Telefonica, fibra.. lo que queramos, yo tengo WAN.\
\
**DNS 1:** 1.1.1.1\
**DNS 2:** 1.0.0.1

En DNS, podemos usar las que queramos, pero personalmente, no uso nunca las del operador ISP.\
\
**VLAN ID:** 6\
Importante, tiene que ser la 6 tanto para Movistar como para O2, lo que no podremos poner es la prioridad, suele ser 0 o 1, pero igualmente funciona.

Nos vamos al apartado IPv4 Connection, y del desplegable, elegiremos PPPoE\
**user:** `adslppp@telefonicanetpa`\
**pass:** `adslppp`

Guardamos los cambios y reiniciamos el USG, recuerda tener conectado el cable de red conectado al puerto WAN y este o bien a la ONT o al puerto del switch del HGU en modo bridge.

![](/files/yLb7A7EJX0A3PdnFnFBO)


# Habilitar DDNS en USG Security Gateway

Entorno:\
\- Unifi Controller v6.5.55\
\- USG Security Gateway, firmware v4.4.56

Entramos en nuestro UniFi Controller, y nos vamos a "Settings", en el menu lateral, una vez dentro, nos dirigimos al menu "Advanced Features", y en la parte derecha de la pantalla, "Advanced Gateway Settings"

![](/files/pCwpL5VWZxFwP7rPtbu9)

Una vez dentro, veremos varias opciones, click en "Create New Dynamic DNS"

![](/files/bRLClyKu00Z6gUJhDnpJ)

Para configurar nuestro DDNS, en este ejemplo lo hago con el servicio [no-ip](https://www.noip.com), necesitamos:\
\- Hostname, nuestro dominio\
\- Username\
\- Password\
\- Server, en este caso, lo dejamos en blanco!

Seleccionamos el interfaz WAN, el servicio que desemos, noip en este ejemplo y rellenamos los datos.

![](/files/ZNu9Pask64jsPhO5n0AB)

Guardamos los cambios y esperamos unos minutos a que haga el aprovisionamiento.


# Error Adopción Pendiente en USG Security Gateway

Pongamos que hemos adoptado con exito nuestro USG en nuestro UniFi Controller, tenemos nuestro USG en nuestro site.. ok.\
\
Pero pongamos que ahora queremos llevarnoslo a otro site dentro de nuestra cuenta de UniFi, hemos adquirido un Cloud Key o hemos instalado UniFi Controller en otra maquina...

Si queremos adoptarlo, nos mostrara un mensaje de adopcion pendiente, y nos saldra un menu de adopcion avanzada, que si entramos en ella, nos muestra la IP de nuestro USG, y en blanco username y password, si has intentado, no es ubnt/ubnt, ni root/ubnt...

Tenemos que irnos al primer UniFi Controller (por tu bien que tengas acceso al si no, no quedara otra que restaruar el USG y volver adoptarlo desde 0)

Entramos en el primer UniFi Controller, y nos vamos a "Settings" y bajamos al final, en el apartado "Application Configuration"

![](/files/6QGb7kLhwfyipUhAh0Vg)

Si nos vamos al final de la nueva pantalla, veremos al final la opcion "Device SSH Authentication", desplegamos y veremos un nombre de usuario y una password, esas credenciales son las que debemos meter en la parte de Adopcion Avanzada, y esperar, ojo!! No tengas a la vez los 2 UniFi Controller iniciados en tu red.

![](/files/jLOmYvvgOEhwzwYBBJMZ)

Si seguimos con problemas de adopcion, debemos entrar por ssh en el USG con las credenciales y ejecutar este comando

```sh
set-inform IP_UNIFI_CONTROLLLER
```

Como ultimo caso, deberas restaurarlo desde 0 por medio del boton reset (2) presionandolo durante 10s.

<figure><img src="/files/gs4w99bbG2qZMbYgOisk" alt=""><figcaption></figcaption></figure>


# Restaurar firmware USG Security Gateway

La memoria del USG es un USB interno, abriremos el USG para formatear el USB y cargarle de nuevo el firmware, son 4 tornillos de tipo estrella bajo las almoadillas de la base.

![](/files/voeTId07ZJfmBNHQcqaI)

Una vez abierto, veremos la memoria USB.

![](/files/qE0iRuSBLN9wW6jPqIV0)

![](/files/y2aJJpjCuQYrCLsqCWNh)

Es un pendrive de 4Gb de almacenamiento, lo conectamos al ordenador y lo formateamos en fat32, asi eliminamos todas las particiones.

Nos descargamos la imagen base desde Ubiquiti para poder restaurar el firmware, es la v4.2

```
https://dl.ubnt-ut.com/cmb/USG-4_2_0-shipped.img.bz2
```

[Link alternativo](https://mega.nz/file/ccRWTZ5T#1eUI_fasXVwfyFlWv2MvM4wlJgQLAUimOygTcrBjmok)

La descomprimes, y tienes un fichero .img, el MD5 del .img es

```
9c09035c3f2bce4bbc8cb1f71c5f04b2
```

Ahora solo queda cargar la imagen en el USB, se puede hacer con varias aplicaciones, personalmente uso la de RaspberryPi Imager, <https://www.raspberrypi.com/software/>.

Abrimos la App y seleccionamos "Choose OS", nos aparecera esta ventana, y al final elegimos "Use custom", localizamos el fichero .img y elegimos el dispositivo, tardara unos minutos...

![](/files/vWsAmol0R0NrNfMZej6X)

![](/files/1rjsnUuQJHXXFGEkruHF)

Mientras se crea el USB con el .img, nos vamos a nuestro UniFi controller y eliminamos el USG que nos aparece.

![](/files/QUheSFf5fdspNGEvpAk4)

Cuando termine de crearse la imagen, volvemos a colocar el USB en el USG, lo cerramos, y conectamos los cables, esperamos a que inicie, luego abirmos nuestro UniFi Controller y nos pedira adoptarlo y actualizar, esperamos a que termine... sera un proceso lento, muy lento...\
\
End!


# Cambiar pasta termica en UniFi Switch 8 150W

Necesitamos:\
\- alcohol, para limpiar el disipador y la superficie de la CPU\
\- pasta termica, he usado [Thermal Grizzly Kryonaut](https://www.amazon.es/Thermal-Grizzly-Kryonaut-12-5W-Compuesto/dp/B011F7W3LU)\
\- Destornillador estrella

Lo primero sera retirar los 2 tornillos de tipo estrella de la parte trasera del swtich, con cuidado deslizamos la tapa, no tires muy furte, hay un cable conectado.

![](/files/sAZBlsyVUztYsyN3B5Mz)

Desconectamos el cable y ya tenemos la placa del swtich.

![](/files/t4FFRpKwphLthbWa6NZ4)

Ahora, desconectaremos el cable de alimentacion de la fuente, y los 4 tornillos que sujetan la placa base.\
\
Despues podremos retirar la placa base, debajo tiene unos thermal pad, no los toques, si los vas a cambiar toma las medidas que tienen, incluido el grosor.

![](/files/oEd4FudfIlwUD6dQQW8z)

Para quitar el disipador, tiene 2 anclajes de plastico, presiona hacia el centro de los mismos y salen facilmente, despues quitamos el disipador

![](/files/BfpIZTzJqbxNgZ0nNy8V)

![](/files/3o3JJOwMRGTg8p9WmvtJ)

![](/files/T7Eavpjuw9psHy4qisGA)

eliminaremos los restos de la cpu para dejar la superficie limpia, la pasta que tiene esta seca, con una cuña de plastico o tarjeta sale sin esfuerzo, limpia los restos con alcohol.

![](/files/vixsNwAAbxlIZMsWxFh7)

![](/files/5JuwJQCwmOAU23jAvtud)

ya solo queda aplicar la pasta termica de forma uniforme sobre la superficie

![](/files/XMmBvESBsYw7pQ7f4Hr6)

Solo queda volver a montar el disipador, colocar el cable, la carcasa y cerrarlo.

{% embed url="<https://youtu.be/p0D3sGj4DZc>" %}


# Crear VLAN en UniFi Controller

Entramos en nuestro UniFi Controller, y nos vamos a ajustes

![](/files/7Xr55CmwK4QPQQV3lWLT)

Seleccionamos "Redes"

![](/files/zijBRTcPKrsKl3G4cgO2)

En esa pantalla veremos las redes (VLANs) creadas, ahora vamos a crear una. Click en "Crear Nueva Red"

![](/files/Egtw0zpYHqdqFMfTbZ41)

Seleccionamos:

* **Finalidad:** Corporativo
* **Grupo de red:** LAN
* **VLAN:** pondremos el valor numerico que deseemos, ejemplo "10"
* **IP Puerta enlace:** rango de IP que queramos con el [CIDR](https://azagramac.gitbook.io/myblog/linux/cidr-mascaras-de-subred), ejemplo: "10.5.10.1/24"
* **Nombre de dominio:** opcional
* **Servidores de DNS:** ejemplo 1.1.1.1 y 1.0.0.1

y guardamos los cambios, esperamos a que se aprovisione y tendremos nuestra VLAN.

Ahora definiremos un puerto del switch a nuestra VLAN, nos vamos a dispositivos y pinchamos en el swtich, en nuestro caso es el US-8-150W

![](/files/Xyk8lj3DHmnlt9w5qQlK)

Seleccionamos "Puertos"

![](/files/YCU4kMtv1cqBkPU402OL)

Elegimos el puerto donde vamos a tener la VLAN y lo editamos.

![](/files/4J0iMIGglNu3QNwkxqWS)

En perfil del puerto del conmutador, elegimos la VLAN creada, en este ejemplo la VLAN es "Network NAS", lo marcamos, guardamos y esperamos a que termine de aprovisionar los cambios.

![](/files/4CXrGi5I69Ay5dJox4Qc)

Ya solo nos queda pinchar en el puerto el dispositivo.


# Cambiar IP local en USG antes de adoptarlo

La red interna del USG utiliza de forma predeterminada la red 192.168.1.0/24, por defecto el USG utiliza la IP 192.168.1.1, pero si tenemos otro rango de red, ejemplo 172.16.1.0/24, tenemos un problema...\
\
La solucion pasa por configurar la IP LAN del USG antes de la adopcion a UniFi Controller.

1. Conectar el USG, la LAN a tu ordenador, no conectes la WAN!!!
2. Cambia la IP de tu ordenador a 192.168.1.100 con mascara /24
3. Abre el terminal y conecta por SSH al USG, las credenciales antes de la adopcion son:\
   user: `ubnt`\
   pass: `ubnt`

```
ssh ubnt@192.168.1.1
```

Usamos el usuario root

```
sudo su -
```

Lo primero es resetar los valores de fabrica si no lo hemos realizado.

```
set-default
```

Y reiniciara, cuando termine, volvemos acceder de nuevo y seguimos en el paso siguiente.<br>

Una vez reiniciado, con usuario root, habilitamos el modo configuración

```
configure
```

Eliminamos la IP actual en el puerto eth1

```
delete interfaces ethernet eth1 address 192.168.1.1/24
```

Configuramos el puerto eht1 con la nueva IP

```
set interfaces ethernet eth1 address 172.16.1.1/24
```

Aplicamos los cambios, una vez ejecutes este paso, perderas la conexion al USG

```
commit
```

Ahora cambia la IP de tu ordenador por una dentro del rango de red que has definido anteriormente, si esta todo correcto, ya puedes unirlo a tu red y adoptarlo con tu UniFi Controller.

Si haces la conexion a internet lo haces por PPPoE, asegurate de haber configurado los parametros de la WAN en UniFi Controller.\
\
:warning: Para evitar problemas de adopcion, antes de resetearlo, estando conectado a internet y a nuestro UniFi Controller, lo eliminamos desde el menu de configuracion del UniFi Controller.


# Configurar DDNS Cloudflare en EdgeRouter 4

<figure><img src="/files/aBTolPyKqTIpAfdN1ZAT" alt=""><figcaption></figcaption></figure>

El cliente que usa el ER-4 es `ddclient`, actualmente no es compatible con la API v4 de Cloudflare, por tanto si intentas configurarlo via web o consola, no va sincronizar la IP con nuestro dominio.\
\
Requisitos:\
\- EdgeRouter 4 (valido EdgeRouter 6P) con firmware: `v2.0.9-hotfix.7` y `v3.0.0`\
\- Dominio con Cloudflare<br>

Entramos en Cloudflare, necesitaremos crear el subdominio y obtener la global api key.

<figure><img src="/files/YbOqHeyzS8ZhjiPJJPAP" alt=""><figcaption></figcaption></figure>

Seleccionamos nuestro dominio y bajamos al final de la página, y pinchamos a la derecha donde pone "**Obtenga el token de la API**"<br>

<figure><img src="/files/RyTgdGQiouLWYAumjUFq" alt=""><figcaption></figcaption></figure>

Pinchamos en "**Ver**" en "**Global API Key**"

<figure><img src="/files/Ewwm5o1Cl4iopQVwMMms" alt=""><figcaption></figcaption></figure>

nos aparecerá esta ventana, nos identificamos con nuestra clave de acceso y después nos mostrara la API KEY, la copiamos y la guardamos, que la vamos a necesitar mas tarde.<br>

<figure><img src="/files/am19xbu95HWg8p3gsyQW" alt=""><figcaption></figcaption></figure>

Ya con la key, ahora creamos el subdominio, volvemos a la pantalla principal de Cloudflare, y ahora pulsamos en "**DNS / Registros**" en el menu lateral.

<figure><img src="/files/h5cDO3kiblVky4ywaXrb" alt=""><figcaption></figcaption></figure>

Veremos una pantalla como esta

<figure><img src="/files/mBO43M6EbzYFAuia7WAp" alt=""><figcaption></figcaption></figure>

Pinchamos en "**Agregar registro**" y rellenamos los campos y guardamos.\
\
**Tipo:** A\
**Nombre:** el que queramos, solo nombre, ese va ser el nombre de nuestro subdominio `{subdomino}.{nuestro_dominio.com}`\
**Dirección IPv4:** Podemos poner cualquier IP, luego se va actualizar sólo cuando configuremos el ER-4\
**Estado del proxy:** Lo deshabilitamos\
**TTL:** Automático.

<figure><img src="/files/xh8pnb4CaEVc5GzwmiIP" alt=""><figcaption></figcaption></figure>

Ejemplo:

<figure><img src="/files/BGqb4hjjTfzS2g6Sn1MH" alt=""><figcaption></figcaption></figure>

Ya tenemos nuestra Global API key y nuestro subdominio creado, ahora nos vamos al router.

Abrimos un terminal y entramos a el por SSH.

<figure><img src="/files/1MKjJeuTtDobhHjFq00x" alt="v2.0.9-hotfix.7"><figcaption></figcaption></figure>

<figure><img src="/files/hxvYigdFvALvf0Okn6Xh" alt="v3.0.0"><figcaption></figcaption></figure>

Ahora es copiar, cambia los datos por los tuyos y pegalos en el terminal. Cambia el interface por el que corresponda en tu caso, en el mio es el `pppoe0`.

```sh
configure
set service dns dynamic interface pppoe0 service custom-cloudflare protocol cloudflare
set service dns dynamic interface pppoe0 service custom-cloudflare server api.cloudflare.com/client/v4
set service dns dynamic interface pppoe0 service custom-cloudflare host-name {your_subdomain.your_domain.com}
set service dns dynamic interface pppoe0 service custom-cloudflare login "your_mail_account_cloudflare"
set service dns dynamic interface pppoe0 service custom-cloudflare password "your_global_api_key"
set service dns dynamic interface pppoe0 service custom-cloudflare options "zone=your_domain.com use=web ssl=yes ttl=1"
commit ; save
```

Si nos fijamos le estamos diciendo en la parte `server`, que use la v4 del cliente de cloudflare. Y en `options`, le pasamos unos parámetros adicionales.

Comprobar el estado de sincronización:

<pre class="language-sh"><code class="lang-sh"><strong>show dns dynamic status
</strong></code></pre>

y nos devolverá si ha ido todo bien algo asi:

```sh
interface    : pppoe0
ip address   : xxx.xxx.xxx.xxx
host-name    : your.domain.com
last update  : Fri Dec 27 18:01:23 2024
update-status: good
```

Forzar actualización:

```sh
update dns dynamic interface pppoe0          
```

output:

```sh
interface    : pppoe0 
[ Status will be updated within 60 seconds ]
```

```sh
$ show dns dynamic status
interface    : pppoe0
ip address   : xxx.xxx.xxx.xxx
host-name    : your.domain.com
last update  : Wed Aug 27 15:08:22 2025
update-status: good
```

Si nos volvemos a cloudlfare, veremos que ahora aparece nuestra IP pública en nuestro registro de DNS. 🎉


# Configuración vía terminal, red Home

Parámetros de configuración de mi red Home con varias VLANs, 🚧(en construcción)🚧

<figure><img src="/files/HwJA0NJ4P8NBpXn4xjnA" alt="EdgeRouter 6 PoE"><figcaption></figcaption></figure>

<figure><img src="/files/tQFnyGt4pMrTD5aNrmQ6" alt="EdgeSwitch 8 PoE"><figcaption></figcaption></figure>

Hardware:

* EdgeRouter 6P, firmware v2.0.9-hotfix.7
* EdgeSwitch 8-150, firmware 1.11.1-lite

![](/files/nM6htKTnTJEh8sVLtCnA) ![](/files/bBkEfWdQfyZST3TRLgsp)

Parámetros vía consola en **EdgeRouter**:

```bash
set firewall all-ping enable
set firewall broadcast-ping disable
set firewall group network-group RED_GUEST description 'Network Guest'
set firewall group network-group RED_GUEST network 10.50.1.0/27
set firewall group network-group RED_HOME description 'Network Home'
set firewall group network-group RED_HOME network 10.10.1.0/24
set firewall group network-group RED_IOT description 'Network IoT'
set firewall group network-group RED_IOT network 10.40.1.0/25
set firewall group network-group RED_NAS description 'Network NAS'
set firewall group network-group RED_NAS network 10.20.1.0/28
set firewall group network-group RFC1918-Ranges description 'RFC 1918 Ranges'
set firewall group network-group RFC1918-Ranges network 192.168.0.0/16
set firewall group network-group RFC1918-Ranges network 172.16.0.0/12
set firewall group network-group RFC1918-Ranges network 10.0.0.0/8
set firewall ipv6-name WANv6_IN default-action drop
set firewall ipv6-name WANv6_IN description 'WAN inbound traffic forwarded to LAN'
set firewall ipv6-name WANv6_IN enable-default-log
set firewall ipv6-name WANv6_IN rule 10 action accept
set firewall ipv6-name WANv6_IN rule 10 description 'Allow established/related sessions'
set firewall ipv6-name WANv6_IN rule 10 state established enable
set firewall ipv6-name WANv6_IN rule 10 state related enable
set firewall ipv6-name WANv6_IN rule 20 action drop
set firewall ipv6-name WANv6_IN rule 20 description 'Drop invalid state'
set firewall ipv6-name WANv6_IN rule 20 state invalid enable
set firewall ipv6-name WANv6_LOCAL default-action drop
set firewall ipv6-name WANv6_LOCAL description 'WAN inbound traffic to the router'
set firewall ipv6-name WANv6_LOCAL enable-default-log
set firewall ipv6-name WANv6_LOCAL rule 10 action accept
set firewall ipv6-name WANv6_LOCAL rule 10 description 'Allow established/related sessions'
set firewall ipv6-name WANv6_LOCAL rule 10 state established enable
set firewall ipv6-name WANv6_LOCAL rule 10 state related enable
set firewall ipv6-name WANv6_LOCAL rule 20 action drop
set firewall ipv6-name WANv6_LOCAL rule 20 description 'Drop invalid state'
set firewall ipv6-name WANv6_LOCAL rule 20 state invalid enable
set firewall ipv6-name WANv6_LOCAL rule 30 action accept
set firewall ipv6-name WANv6_LOCAL rule 30 description 'Allow IPv6 icmp'
set firewall ipv6-name WANv6_LOCAL rule 30 protocol ipv6-icmp
set firewall ipv6-name WANv6_LOCAL rule 40 action accept
set firewall ipv6-name WANv6_LOCAL rule 40 description 'allow dhcpv6'
set firewall ipv6-name WANv6_LOCAL rule 40 destination port 546
set firewall ipv6-name WANv6_LOCAL rule 40 protocol udp
set firewall ipv6-name WANv6_LOCAL rule 40 source port 547
set firewall ipv6-receive-redirects disable
set firewall ipv6-src-route disable
set firewall ip-src-route disable
set firewall log-martians enable
# lista de reglas de firewall ocultas por seguridad.
set firewall name WAN_IN default-action drop
set firewall name WAN_IN description 'WAN to internal'
set firewall name WAN_IN rule 10 action accept
set firewall name WAN_IN rule 10 description 'Allow established/related'
set firewall name WAN_IN rule 10 state established enable
set firewall name WAN_IN rule 10 state related enable
set firewall name WAN_IN rule 20 action drop
set firewall name WAN_IN rule 20 description 'Drop invalid state'
set firewall name WAN_IN rule 20 state invalid enable
set firewall name WAN_LOCAL default-action drop
set firewall name WAN_LOCAL description 'WAN to router'
set firewall name WAN_LOCAL rule 10 action accept
set firewall name WAN_LOCAL rule 10 description 'Allow established/related'
set firewall name WAN_LOCAL rule 10 state established enable
set firewall name WAN_LOCAL rule 10 state related enable
set firewall name WAN_LOCAL rule 20 action drop
set firewall name WAN_LOCAL rule 20 description 'Drop invalid state'
set firewall name WAN_LOCAL rule 20 state invalid enable
set firewall options mss-clamp mss 1412
set firewall receive-redirects disable
set firewall send-redirects enable
set firewall source-validation disable
set firewall syn-cookies enable
set interfaces ethernet eth0 duplex auto
set interfaces ethernet eth0 poe output 24v # habilita el POE para conectar Ufiber Nano G
set interfaces ethernet eth0 speed auto
set interfaces ethernet eth0 vif 6 description 'Internet Movistar / O2'
set interfaces ethernet eth0 vif 6 pppoe 0 default-route auto
set interfaces ethernet eth0 vif 6 pppoe 0 dhcpv6-pd pd 0 interface eth1 host-address '::1'
set interfaces ethernet eth0 vif 6 pppoe 0 dhcpv6-pd pd 0 interface eth1 prefix-id ':1'
set interfaces ethernet eth0 vif 6 pppoe 0 dhcpv6-pd pd 0 interface eth1 service slaac
set interfaces ethernet eth0 vif 6 pppoe 0 dhcpv6-pd pd 0 interface eth2 host-address '::1'
set interfaces ethernet eth0 vif 6 pppoe 0 dhcpv6-pd pd 0 interface eth2 prefix-id ':2'
set interfaces ethernet eth0 vif 6 pppoe 0 dhcpv6-pd pd 0 interface eth2 service slaac
set interfaces ethernet eth0 vif 6 pppoe 0 dhcpv6-pd pd 0 prefix-length /56
set interfaces ethernet eth0 vif 6 pppoe 0 dhcpv6-pd rapid-commit enable
set interfaces ethernet eth0 vif 6 pppoe 0 firewall in ipv6-name WANv6_IN
set interfaces ethernet eth0 vif 6 pppoe 0 firewall in name WAN_IN
set interfaces ethernet eth0 vif 6 pppoe 0 firewall local ipv6-name WANv6_LOCAL
set interfaces ethernet eth0 vif 6 pppoe 0 firewall local name WAN_LOCAL
set interfaces ethernet eth0 vif 6 pppoe 0 mtu 1492
set interfaces ethernet eth0 vif 6 pppoe 0 name-server auto
set interfaces ethernet eth0 vif 6 pppoe 0 password adslppp
set interfaces ethernet eth0 vif 6 pppoe 0 user-id adslppp@telefonicapa
set interfaces ethernet eth1 address 192.168.1.1/24
set interfaces ethernet eth1 description eth1
set interfaces ethernet eth1 duplex auto
set interfaces ethernet eth1 poe output off
set interfaces ethernet eth1 speed auto
set interfaces ethernet eth2 address 172.16.1.1/24
set interfaces ethernet eth2 description eth2
set interfaces ethernet eth2 duplex auto
set interfaces ethernet eth2 poe output off
set interfaces ethernet eth2 speed auto
set interfaces ethernet eth3 description eth3
set interfaces ethernet eth3 duplex auto
set interfaces ethernet eth3 poe output off
set interfaces ethernet eth3 speed auto
set interfaces ethernet eth4 description eth4
set interfaces ethernet eth4 duplex auto
set interfaces ethernet eth4 poe output off
set interfaces ethernet eth4 speed auto
set interfaces ethernet eth5 description SFP
set interfaces ethernet eth5 duplex auto
set interfaces ethernet eth5 speed auto
set interfaces ethernet eth5 vif 10 address 10.10.1.1/24
set interfaces ethernet eth5 vif 10 description 'Network Home'
set interfaces ethernet eth5 vif 10 firewall in name HOME_IN
set interfaces ethernet eth5 vif 20 address 10.20.1.1/28
set interfaces ethernet eth5 vif 20 description 'Network NAS'
set interfaces ethernet eth5 vif 20 firewall in name NAS_IN
set interfaces ethernet eth5 vif 40 address 10.40.1.1/25
set interfaces ethernet eth5 vif 40 description 'Network IoT'
set interfaces ethernet eth5 vif 40 firewall in name IOT_IN
set interfaces ethernet eth5 vif 40 mtu 1500
set interfaces ethernet eth5 vif 50 address 10.50.1.1/27
set interfaces ethernet eth5 vif 50 description 'Network Guest'
set interfaces ethernet eth5 vif 50 firewall in name GUEST_IN
set interfaces ethernet eth5 vif 50 mtu 1500
set interfaces loopback lo
set port-forward auto-firewall enable
set port-forward hairpin-nat enable
set port-forward lan-interface eth5
set port-forward wan-interface pppoe0
set protocols static interface-route 172.16.1.0/24 next-hop-interface eth2
set service dhcp-server disabled false
set service dhcp-server hostfile-update disable
set service dhcp-server shared-network-name GUEST authoritative disable
set service dhcp-server shared-network-name GUEST subnet 10.50.1.0/27 default-router 10.50.1.1
set service dhcp-server shared-network-name GUEST subnet 10.50.1.0/27 dns-server 1.1.1.1
set service dhcp-server shared-network-name GUEST subnet 10.50.1.0/27 dns-server 1.0.0.1
set service dhcp-server shared-network-name GUEST subnet 10.50.1.0/27 lease 86400
set service dhcp-server shared-network-name GUEST subnet 10.50.1.0/27 start 10.50.1.2 stop 10.50.1.30
set service dhcp-server shared-network-name HOME authoritative disable
set service dhcp-server shared-network-name HOME subnet 10.10.1.0/24 default-router 10.10.1.1
set service dhcp-server shared-network-name HOME subnet 10.10.1.0/24 dns-server 1.1.1.1
set service dhcp-server shared-network-name HOME subnet 10.10.1.0/24 dns-server 1.0.0.1
set service dhcp-server shared-network-name HOME subnet 10.10.1.0/24 lease 604800
set service dhcp-server shared-network-name HOME subnet 10.10.1.0/24 start 10.10.1.100 stop 10.10.1.200
set service dhcp-server shared-network-name IOT authoritative disable
set service dhcp-server shared-network-name IOT subnet 10.40.1.0/25 default-router 10.40.1.1
set service dhcp-server shared-network-name IOT subnet 10.40.1.0/25 dns-server 8.8.8.8
set service dhcp-server shared-network-name IOT subnet 10.40.1.0/25 dns-server 8.8.4.4
set service dhcp-server shared-network-name IOT subnet 10.40.1.0/25 lease 86400
set service dhcp-server shared-network-name IOT subnet 10.40.1.0/25 start 10.40.1.2 stop 10.40.1.126
set service dhcp-server shared-network-name LAN1 authoritative disable
set service dhcp-server shared-network-name LAN1 subnet 192.168.1.0/24 default-router 192.168.1.1
set service dhcp-server shared-network-name LAN1 subnet 192.168.1.0/24 dns-server 1.1.1.1
set service dhcp-server shared-network-name LAN1 subnet 192.168.1.0/24 dns-server 1.0.0.1
set service dhcp-server shared-network-name LAN1 subnet 192.168.1.0/24 lease 86400
set service dhcp-server shared-network-name LAN1 subnet 192.168.1.0/24 start 192.168.1.38 stop 192.168.1.243
set service dhcp-server shared-network-name LAN2 authoritative disable
set service dhcp-server shared-network-name LAN2 subnet 192.168.2.0/24 default-router 192.168.2.1
set service dhcp-server shared-network-name LAN2 subnet 192.168.2.0/24 dns-server 192.168.2.1
set service dhcp-server shared-network-name LAN2 subnet 192.168.2.0/24 lease 86400
set service dhcp-server shared-network-name LAN2 subnet 192.168.2.0/24 start 192.168.2.38 stop 192.168.2.243
set service dhcp-server shared-network-name NAS authoritative disable
set service dhcp-server shared-network-name NAS subnet 10.20.1.0/28 default-router 10.20.1.1
set service dhcp-server shared-network-name NAS subnet 10.20.1.0/28 dns-server 1.1.1.1
set service dhcp-server shared-network-name NAS subnet 10.20.1.0/28 dns-server 1.0.0.1
set service dhcp-server shared-network-name NAS subnet 10.20.1.0/28 lease 86400
set service dhcp-server shared-network-name NAS subnet 10.20.1.0/28 start 10.20.1.2 stop 10.20.1.14
set service dhcp-server static-arp disable
set service dhcp-server use-dnsmasq disable
set service dns dynamic interface pppoe0 service custom-cloudflare host-name {{ subdomian.domain.com }}
set service dns dynamic interface pppoe0 service custom-cloudflare login {{ your-mail }}
set service dns dynamic interface pppoe0 service custom-cloudflare options 'zone={{ domain.com }} use=web ssl=yes ttl=1'
set service dns dynamic interface pppoe0 service custom-cloudflare password {{ global-api-key }}
set service dns dynamic interface pppoe0 service custom-cloudflare protocol cloudflare
set service dns dynamic interface pppoe0 service custom-cloudflare server api.cloudflare.com/client/v4/
set service dns forwarding cache-size 10000
set service dns forwarding listen-on eth1
set service dns forwarding listen-on eth2
set service dns forwarding name-server 1.1.1.1
set service dns forwarding name-server 1.0.0.1
set service gui http-port 80
set service gui https-port 443
set service gui older-ciphers enable
set service lldp interface eth1
set service lldp interface eth2
set service lldp interface eth3
set service lldp interface eth4
set service lldp interface eth5
set service nat rule 5010 description 'masquerade for WAN'
set service nat rule 5010 outbound-interface pppoe0
set service nat rule 5010 type masquerade
set service ssh port {{ port-ssh }}
set service ssh protocol-version v2
set service ubnt-discover
set service unms disable
set system analytics-handler send-analytics-report false
set system crash-handler send-crash-report false
set system host-name {{ hostname }}
set system login user ubnt level admin
set system name-server 1.1.1.1
set system name-server 1.0.0.1
set system ntp server 0.ubnt.pool.ntp.org
set system ntp server 1.ubnt.pool.ntp.org
set system ntp server 2.ubnt.pool.ntp.org
set system ntp server 3.ubnt.pool.ntp.org
set system ntp server time.cloudflare.com
set system ntp server time.google.com
set system offload hwnat disable
set system offload ipsec enable
set system offload ipv4 forwarding enable
set system offload ipv4 pppoe enable
set system offload ipv4 vlan enable
set system offload ipv6 forwarding enable
set system offload ipv6 pppoe enable
set system syslog global facility all level notice
set system syslog global facility protocols level debug
set system time-zone Europe/Madrid
```

Si quieres ejecutar de forma masiva los comandos en el EdgeRouter, crea un script en el router:

```bash
#!/bin/vbash

CMD=/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper

$CMD begin

$CMD set system offload hwnat disable
$CMD set system offload ipsec enable
$CMD set system offload ipv4 forwarding enable
$CMD set system offload ipv4 pppoe enable
$CMD set system offload ipv4 vlan enable
$CMD set system offload ipv6 forwarding enable
$CMD set system offload ipv6 pppoe enable
$CMD set system syslog global facility all level notice
$CMD set system syslog global facility protocols level debug
$CMD set system time-zone Europe/Madrid
... # tantos comandos de configuracion necesites.
$CMD commit
$CMD end
$CMD save

exit
```

Le damos permisos de ejecución, y lo ejecutamos directamente desde el router, y esperamos a que termine, el tiempo dependerá de la lista que tengamos de parámetros de configuración.

* Información de [Hardware offloading](https://help.uisp.com/hc/en-us/articles/22591077433879-EdgeRouter-Hardware-Offloading)
* Habilitar [DDNS Cloudflare](/unifi/configurar-ddns-cloudflare-en-edgerouter-4)

<figure><img src="/files/tQFnyGt4pMrTD5aNrmQ6" alt=""><figcaption></figcaption></figure>

Parámetros vía consola en **EdgeSwitch**:

Ver configuración actual

<pre class="language-bash"><code class="lang-bash">$ ssh user@ip-switch
<strong>user@ip-switch's password: 
</strong>  _____    _
 | ____|__| | __ _  ___
 |  _| / _  |/ _  |/ _ \         (c) Ubiquiti, Inc.
 | |__| (_| | (_| |  __/
 |_____\__._|\__. |\___|         https://www.ui.com
             |___/

Welcome to EdgeSwitch

********************************* NOTICE **********************************
* By logging in to, accessing, or using any Ubiquiti product, you are     *
* signifying that you have read our Terms of Service (ToS) and End User   *
* License Agreement (EULA), understand their terms, and agree to be       *
* fully bound to them. The use of CLI (Command Line Interface) can        *
* potentially harm Ubiquiti devices and result in lost access to them and *
* their data. By proceeding, you acknowledge that the use of CLI to       *
* modify device(s) outside of their normal operational scope, or in any   *
* manner inconsistent with the ToS or EULA, will permanently and          *
* irrevocably void any applicable warranty.                               *
***************************************************************************

(edgeswitch-8) > en
Password: ***********************

(edgeswitch-8) # show running-config
</code></pre>

**Habilitar UISP** (requiere suscripción desde el 1 Julio 2025)

{% embed url="<https://eu.store.ui.com/eu/en/category/wired-hosting/collections/uisp-cloud-hosting/products/uisp-cloud-hosting-pro?variant=uisp-cloud-hosting-pro>" %}

```sh
enable
configure
service unms
service unms key wss://{your_domain}.uisp.com:443+{token}+allowSelfSignedCertificate
exit
write memory confirm
exit
```

**Habilitar LLDP**

{% embed url="<https://help.uisp.com/hc/en-us/articles/22591768765463-EdgeSwitch-OUI-Based-Auto-VoIP>" %}

{% embed url="<https://help.uisp.com/hc/en-us/articles/22591186943767-EdgeRouter-LLDP>" %}

```bash
enable
configure
interface 0/1-0/10
lldp transmit
lldp receive
lldp transmit-tlv port-desc
lldp transmit-tlv sys-name
lldp transmit-tlv sys-desc
lldp transmit-tlv sys-cap
lldp transmit-mgmt
lldp notification
lldp med confignotification
exit
write memory
```

<figure><img src="/files/Rd8pvZ0o7Na0lIoJtSuc" alt=""><figcaption></figcaption></figure>


# Configurar WireGuard en EdgeRouter 4 / 6P

<figure><img src="/files/3zW0MxrDInT7ZupcdJpa" alt=""><figcaption></figcaption></figure>

Vamos a configurar la VPN de WireGuard en el EdgeRouter 6P / EdgeRouter 4

{% hint style="info" %}
Realizado en firmware **v2.0.9-hotfix.7,** en la nueva version v3.0.0 incluye de serie wireguard, los comandos son los mismos.
{% endhint %}

Primero de todo, nos conectamos por terminal al router

<pre class="language-sh"><code class="lang-sh">$ ssh ubnt@ip_router
  _____    _            
 | ____|__| | __ _  ___          (c) 2010-2020
 |  _| / _  |/ _  |/ _ \         Ubiquiti Networks, Inc.
 | |__| (_| | (_| |  __/         
 |_____\__._|\__. |\___|         https://www.ubnt.com
             |___/

Welcome to EdgeOS

By logging in, accessing, or using the Ubiquiti product, you
acknowledge that you have read and understood the Ubiquiti
License Agreement (available in the Web UI at, by default,
http://192.168.1.1) and agree to be bound by its terms.

<strong>ubnt@XXX.XXX.XXX.XXX's password: 
</strong>Linux EdgeRouter-4 4.9.79-UBNT #1 SMP Thu Jun 15 11:34:36 UTC 2023 mips64
Welcome to EdgeOS
ubnt@EdgeRouter-4:~$
</code></pre>

Con el fin de tener todo organizado, creamos una carpeta de nombre `wireguard` en `/home/$user`

```sh
mkdir wireguard && cd wireguard
```

### Descargar e instalar wireguard

Ahora, descargamos el paquete de wireguard para el EdgeRouter 4 (válido para el 6P, también hay otros modelos disponibles)

<figure><img src="/files/DZ5kKK2L7EBahin2EEon" alt="" width="128"><figcaption></figcaption></figure>

Repositorio oficial de WireGuard para EdgeOS: <https://github.com/WireGuard/wireguard-vyatta-ubnt/releases>

<pre class="language-sh"><code class="lang-sh"><strong>curl -OL https://github.com/WireGuard/wireguard-vyatta-ubnt/releases/download/1.0.20220627-1/e300-v2-v1.0.20220627-v1.0.20210914.deb
</strong></code></pre>

Ya con el paquete descargado, lo instalamos

```sh
sudo dpkg -i e300-v2-v1.0.20220627-v1.0.20210914.deb
```

y verificamos la instalación

```sh
ubnt@EdgeRouter-4:~$ sudo wg --version
wireguard-tools v1.0.20210914 - https://git.zx2c4.com/wireguard-tools/
```

### Generar claves

<figure><img src="/files/5F6XrbpTWdaJ6Ox8f7ol" alt="" width="128"><figcaption></figcaption></figure>

Generamos las clave privada y pública y tambien la preshared-key

```sh
wg genkey | tee /config/auth/wireguard.key | wg pubkey >  /config/auth/wireguard.pub
wg genpsk | tee /config/auth/wireguard.psk
```

Comprobamos las claves

```sh
ubnt@EdgeRouter-4:~$ ls -l /config/auth/
total 12
-rw-r--r--    1 ubnt     vyattacf        45 Dec 31 02:13 wireguard.key
-rw-r--r--    1 ubnt     vyattacf        45 Dec 31 02:13 wireguard.psk
-rw-r--r--    1 ubnt     vyattacf        45 Dec 31 02:13 wireguard.pub
```

### Configuracion parte servidor.

Ahora definiremos las reglas del firewall.

```sh
configure
set firewall name WAN_LOCAL rule 30 description 'Allow WireGuard'
set firewall name WAN_LOCAL rule 30 action accept
set firewall name WAN_LOCAL rule 30 protocol udp
set firewall name WAN_LOCAL rule 30 destination port 51820
commit ;save
```

{% hint style="success" %}
El puerto `51820`, es por defecto, pero por seguridad mejor utiliza otro.
{% endhint %}

### Configurar Interface `wg0`

```sh
configure
set interfaces wireguard wg0 description "WireGuard"
set interfaces wireguard wg0 private-key /config/auth/wireguard.key
set interfaces wireguard wg0 address 10.1.1.1/24
set interfaces wireguard wg0 listen-port 51820
set interfaces wireguard wg0 route-allowed-ips false
commit ;save
```

{% hint style="warning" %}
En `address`, introduce la IP que quieras usar como servidor de wireguard, y asegurate de seleccionar el puerto que has definido en el paso anterior en `destination port`.
{% endhint %}

{% hint style="info" %}
Te habrás fijado que la opción `route-allowed-ips` está en `false`, es porque vamos a establecer acceso a la LAN.
{% endhint %}

### Configuración de peers, tantos como necesites.

Ya tenemos la parte servidor configurado, ahora toca generar los clientes (peers).

Generamos la clave privada y pública de nuestra peer, (aquí podemos generar tantas como queramos.)

```bash
wg genkey | tee /home/ubnt/wireguard/peer1.key | wg pubkey > /home/ubnt/wireguard/peer.pub
```

Si queremos generar mas, tan solo cambiamos el 1 por un 2 por ejemplo y listo:

```bash
wg genkey | tee /home/ubnt/wireguard/peer2.key | wg pubkey > /home/ubnt/wireguard/peer2.pub
```

Necesitaremos la clave privada (`peerX.key`) que usaremos luego para configurar nuestra App.

Hacemos un cat a nuestra clave pública de nuestra peer

```bash
cat /home/ubnt/wireguard/peerX.pub
```

y copiamos nuestra clave.

Ahora configuraremos nuestro peer, adaptarlo a vuestra configuración.

<pre class="language-sh"><code class="lang-sh"><strong>configure
</strong>set interfaces wireguard wg0 peer {{ peer1 pub key }} description "Android"
set interfaces wireguard wg0 peer {{ peer1 pub key }} allowed-ips 10.1.1.2/32
set interfaces wireguard wg0 peer {{ peer1 pub key }} endpoint {{ your_sub_domain.domain.com }}:51820
set interfaces wireguard wg0 peer {{ peer1 pub key }} persistent-keepalive 25
set interfaces wireguard wg0 peer {{ peer1 pub key }} preshared-key /config/auth/wireguard.psk
commit ;save
</code></pre>

{% hint style="warning" %}
WireGuard usa `allowed-ips` también como **tabla de enrutamiento, n**o puede haber dos peers con la **misma red exacta** en `allowed-ips`.

Si lo haces (ejemplo: ambos tienen `0.0.0.0/0` y `10.1.1.0/24`), WireGuard no sabe a qué peer enviar ese tráfico → normalmente se asigna al **último peer configurado**, y el otro queda “aislado”.
{% endhint %}

En el cliente, ya le asignas las redes a las cuales quieres tener acceso, si son VLANs, recuerda que debes configurarlas previamente en el router.

{% hint style="info" %}
`endpoint {{ your_sub_domain.domain.com }}:51820`\
Aqui pon el mismo puerto que estableciste antes en la parte servidor.
{% endhint %}

\
Realizaremos estos pasos, tantas veces como peers queramos poner, recuerda siempre poner una pub key diferente a cada peer y la IP, que no tengan varios peers, misma IP.

Entramos en el interfaz web del router, y veremos nuestro nuevo interfaz.

<figure><img src="/files/i4Y5YTAEy0KEHPN2c7dH" alt=""><figcaption></figcaption></figure>

###

### Configuración para cliente WireGuard

Creamos un fichero de texto que guardaremos como `peer.conf`

```yaml
[Interface]
Address = {{ IP definido antes para el peer }}
DNS = 1.1.1.1,1.0.0.1     # Si tienes un AdGuard Home o PiHole, puedes poner su IP
ListenPort = 51820        # Puerto que hayas definido en la parte servidor
PrivateKey = {{ clave /home/ubnt/wireguard/peer.key }}

[Peer]
AllowedIPs = 0.0.0.0/0, 192.168.1.0/24, 172.16.1.0/24    # Rangos de IP que quieres acceder
Endpoint = {{ your_sub_domain.domain.com }}:51820
PersistentKeepalive = 25
PreSharedKey = {{ clave /config/auth/wireguard.psk }}
PublicKey = {{ clave /config/auth/wireguard.pub }}
```

###

### Configurar cliente App WireGuard

Nos descargamos la App para nuestro dispositivo. [Google Play](https://play.google.com/store/apps/details?id=com.wireguard.android) o [App Store](https://apps.apple.com/es/app/wireguard/id1441195209)

Creamos una nueva configuración desde 0.

* **Nombre:** El que queramos.
* **Clave privada:** Pegamos el contenido de `/home/ubnt/wireguard/peer.key`
* **Clave pública:** Se rellena automáticamente al poner la privada. (Que coincidirá con el `peer.pub`)
* **Direcciones:** Una IPv4 del rango que definimos "[Configurar interface](#configurar-interface)", en este tutorial `10.1.1.1/24`, pero no la `10.1.1.1,` que esa es reservada del wireguard, elige otra dentro del rango.
* **Puerto:** El que hemos definimos anteriormente.
* **Servidor DNS:** podemos usar uno público, ejemplo `1.1.1.1,1.0.0.1` de Cloudflare, de Google `8.8.8.8,8.8.4.4` o mejor... si tenemos montado un [AdGuardHome](https://github.com/azagramac/adguardhome-docker) o un PiHole, podemos poner la IP del host donde lo tenemos, así evitamos tener publicidad también por la VPN 😎
* **MTU:** lo dejamos en auto

<figure><img src="/files/gEC0ofzpBIQH4ppow9JT" alt="" width="375"><figcaption></figcaption></figure>

Le añadimos un Par.

* **Clave pública:** Pegamos el contenido de `/config/auth/wireguard.pub`
* **Clave precompartida:** Pegamos el contenido de `/config/auth/wireguard.psk`
* **Keepalive:** El tiempo que definimos anteriormente en "[Configuración de Peers](#configuracion-de-peers)"
* **EndPoint:** EL dominio y puerto, el puerto es el definido en "[Definir reglas](#definir-reglas)", `{domain}:{port}` que tengamos configurado para poder acceder al el, si tenemos un DDNS, lo pondremos en este campo.
* **IPs permitidas:** Aqui pondremos los rangos separados por "`,`" que queramos tener acceso, en lugar de poner el comodin `0.0.0.0/0`, podemos poner el rango de nuestra LAN, por ejemplo `192.16.1.0/24`, la que definimos en "[Configuración de peers](#configuracion-de-peers)"

<figure><img src="/files/h8mIG0w7D6BtwyjTrvlg" alt="" width="375"><figcaption></figcaption></figure>

### Resultados

<figure><img src="/files/DU3q0D1FzTPoPxs8iUlC" alt="" width="375"><figcaption></figcaption></figure>

En esta captura, vemos como conectado en la red móvil, con la VPN, filtramos la publicidad y además tenemos habilitado DoT[^1] y DoH[^2]. 😎

<figure><img src="/files/7YieBezWfxOWLm7iuQ1c" alt="" width="563"><figcaption></figcaption></figure>

### Test de velocidad.

* **Red movil:** 4G
* **Operador:** Simyo
* **VPN:** Conectado

<figure><img src="/files/GQ92kP6rMimnRKG44Sgd" alt="" width="375"><figcaption></figcaption></figure>

Si queremos ver desde el router el estado de los peers

```bash
$ sudo wg show
interface: wg0
  public key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  private key: (hidden)
  listening port: 51820

peer: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  preshared key: (hidden)
  endpoint: xxx.xxx.xxx.xxx:48735
  allowed ips: 10.1.1.2/32
  latest handshake: 28 minutes, 15 seconds ago
  transfer: 742.85 MiB received, 988.86 MiB sent
  persistent keepalive: every 25 seconds

peer: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  preshared key: (hidden)
  endpoint: xxx.xxx.xxx.xxx:51820
  allowed ips: 10.1.1.3/32
  transfer: 0 B received, 44.08 KiB sent
  persistent keepalive: every 25 seconds

peer: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  preshared key: (hidden)
  endpoint: xxx.xxx.xxx.xxx:51820
  allowed ips: 10.1.1.4/32
  transfer: 0 B received, 44.37 KiB sent
  persistent keepalive: every 25 seconds
```

y para ver una lista de los comandos ejecutados:

```bash
$ show configuration commands | grep wireguard
set interfaces wireguard wg0 address 10.1.1.1/24
set interfaces wireguard wg0 description WireGuard
set interfaces wireguard wg0 listen-port 51820
set interfaces wireguard wg0 mtu 1420
set interfaces wireguard wg0 peer {{ peer2 pub key }} allowed-ips 10.1.1.3/32
set interfaces wireguard wg0 peer {{ peer2 pub key }} description 'MacBook Pro'
set interfaces wireguard wg0 peer {{ peer2 pub key }} endpoint 'xxxxxxxxxxxxxxxxxxxx:51820'
set interfaces wireguard wg0 peer {{ peer2 pub key }} persistent-keepalive 25
set interfaces wireguard wg0 peer {{ peer2 pub key }} preshared-key /config/auth/wireguard.psk
set interfaces wireguard wg0 peer {{ peer3 pub key }} allowed-ips 10.1.1.4/32
set interfaces wireguard wg0 peer {{ peer3 pub key }} description 'NothingPhone'
set interfaces wireguard wg0 peer {{ peer3 pub key }} endpoint 'xxxxxxxxxxxxxxxxxxxx:51820'
set interfaces wireguard wg0 peer {{ peer3 pub key }} persistent-keepalive 25
set interfaces wireguard wg0 peer {{ peer3 pub key }} preshared-key /config/auth/wireguard.psk
set interfaces wireguard wg0 peer {{ peer1 pub key }} allowed-ips 10.1.1.2/32
set interfaces wireguard wg0 peer {{ peer1 pub key }} description 'OnePlus 8T'
set interfaces wireguard wg0 peer {{ peer1 pub key }} endpoint 'xxxxxxxxxxxxxxxxxxxx:51820'
set interfaces wireguard wg0 peer {{ peer1 pub key }} persistent-keepalive 25
set interfaces wireguard wg0 peer {{ peer1 pub key }} preshared-key /config/auth/wireguard.psk
set interfaces wireguard wg0 private-key /config/auth/wireguard.key
set interfaces wireguard wg0 route-allowed-ips false

$ show interfaces wireguard
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface    IP Address                        S/L  Description                 
---------    ----------                        ---  -----------                 
wg0          10.1.1.1/24                      u/u  WireGuard
```

A disfrutar! 😊

[^1]: DNS sobre TLS, o DoT, es un estándar para encriptar las consultas de DNS y mantenerlas seguras y privadas. DoT utiliza el mismo protocolo de seguridad, TLS, que usan los sitios web HTTPS para encriptar y autenticar las comunicaciones. (TLS también se conoce como "[ SSL](https://www.cloudflare.com/learning/ssl/what-is-ssl/).") DoT añade la encriptación TLS sobre el protocolo de datagrama de usuarios (UDP), que se utiliza para las consultas de DNS. Además, garantiza que las solicitudes y respuestas de DNS no sean manipuladas o falsificadas mediante [ataques en ruta](https://www.cloudflare.com/learning/security/threats/on-path-attack/).

[^2]: El DNS sobre HTTPS, o DoH, es una alternativa a DoT. Con DoH, las consultas y respuestas de DNS están encriptadas, pero se envían a través de los protocolos [HTTP](https://www.cloudflare.com/learning/ddos/glossary/hypertext-transfer-protocol-http/) o [HTTP/2](https://www.cloudflare.com/learning/performance/http2-vs-http1.1/), en lugar de hacerlo directamente por UDP. Al igual que DoT, DoH garantiza que los atacantes no puedan falsificar o alterar el tráfico de DNS. El tráfico DoH se parece al resto del tráfico HTTPS (por ejemplo, las interacciones normales de los usuarios con sitios y aplicaciones web) desde la perspectiva de un administrador de red.


# Docker


# Jellyfin for NAS Synology

<figure><img src="/files/NWGhgTiT7AkrRlYJx5r6" alt=""><figcaption></figcaption></figure>

Jellyfin desplegado en un contenedor en NAS Synology (DS423+) con DSM 7.2 y aceleración por hardware habilitada.

Lo primero es instalar el modulo en el NAS si no lo tenemos.

Entramos en "Centro de paquetes" y buscamos "Container manager" o "docker" y lo instalamos.

<figure><img src="/files/kUyQGW5ctrKhb9qTxM3I" alt=""><figcaption></figcaption></figure>

Abrimos Container manager y seleccionamos "**Proyecto**"

<figure><img src="/files/pLb6bwJe80G4IVyOMPAa" alt=""><figcaption></figcaption></figure>

Pegamos el código de docker-compose

```yaml
version: "3.9"

services:
  jellyfin:
    image: jellyfin/jellyfin:latest
    container_name: jellyfin
    restart: always
    user: 1027:100
    group_add:
      - "937"
    volumes:
      - /volume1/docker/jellyfin/config:/config:rw
      - /volume1/docker/jellyfin/cache:/cache:rw
      - /volume1/video:/media:rw    
    environment:
      - PUID=1027
      - PGID=100
      - TZ=Europe/Madrid
      - JELLYFIN_FFMPEG=/usr/lib/jellyfin-ffmpeg/ffmpeg
      - JELLYFIN_WEB_DIR=/jellyfin/jellyfin-web
      - JELLYFIN_DATA_DIR=/config
      - JELLYFIN_CACHE_DIR=/cache
      - JELLYFIN_CONFIG_DIR=/config/config
      - JELLYFIN_LOG_DIR=/config/log
      - XDG_CACHE_HOME=/cache
    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128
    ports:
      - 8096:8096/tcp
      - 8920:8920/tcp
      - 7359:7359/udp
    healthcheck:
      test: curl --fail http://localhost:8096/health || exit 1
      interval: 45s
      timeout: 30s
      retries: 3
    mem_limit: 10240m

networks:
  jellyfin:

```

{% hint style="warning" %}
Ajusta `volumes` para que monte las unidades que corresponda y el `mem_limit: 10240m`, en este ejemplo son 10Gb de ram, tengo 18Gb en el NAS, ajústalo a tu hardware y el `user` que corresponda en tu caso.
{% endhint %}

Una vez creado descargara la imagen y levantara el contenedor.

<figure><img src="/files/5364ABmPzM0VqLGWBHr9" alt=""><figcaption></figcaption></figure>

Ya le indicamos el dispositivo para habilitar la aceleración por hardware.

```yaml
    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128
```

Si tenemos otro dispositivo, podemos verificar cual es:

```bash
$ ls -l /dev/dri/
crw------- 1 root root 226, 0 Sep 4 08:00 card0
crw-rw---- 1 root videodriver 226, 128 Sep 4 08:00 renderD128
```

Y nos quedaría conocer el ID del grupo videodriver, que en este caso es el 937, lo declaramos en el docker-compose en `group_add`

```bash
$ grep videodriver /etc/group
videodriver:x:937:
```

Podemos ver su estado.

<figure><img src="/files/GaSIq349vgiHVfMRqlXd" alt=""><figcaption></figcaption></figure>

Entramos en el interfaz web de jellyfin `http://IP-NAS:8096/web/#/dashboard/playback/transcoding`

Entramos en "**Panel de control**"

<figure><img src="/files/UHLfiec9EkGoJO8p46Tf" alt=""><figcaption></figcaption></figure>

Seleccionamos en "**Reproducción**" y dentro "**Conversión**"

<figure><img src="/files/6ADLlMPm2A2KTTLH7GXR" alt=""><figcaption></figcaption></figure>

En "**Acceleración por hardware**" seleccionamos Intel QuickSync (QSV) y en QS Device `/dev/dri/renderD128`

Marcamos en "**Activar decodificación por hardware para**"

* ✅ H264
* ✅ HEVC
* ✅MPEG2
* ✅ VC1
* ✅ VP8
* ✅ VP9
* ❌ AV1
* ✅ HEVC 10bit
* ✅ VP9 10bit
* ✅ HEVC RExt 8/10bit
* ❌ HEVC RExt 12bit

✅ Preferir decodificadores de hardware DXVA o VA-API nativos del sistema operativo

#### Opciones de codificación por hardware

* ✅ Activar codificación por hardware
* ❌ Habilitar el codificador hardware H.264 de bajo consumo de Intel
* ❌ Habilitar el codificador hardware HEVC de bajo consumo de Intel

#### Opciones de formato de codificación

* ✅ Permitir la codificación en formato HEVC
* ❌ Permitir encodificación en formato AV1

{% hint style="danger" %}
No marques ninguna opción de AV1 ya que en contenido con 4K HEVC por ejemplo, dará problemas de reproducción
{% endhint %}

Bajamos al final de la pagina y le damos a "**Guardar**", reiniciaremos el contenedor desde "**Container manager**"


# HomeBridge en Docker

Para quienes no lo sepan, Homebridge es un software para hacer compatible dispositivos no certificados ni pensados para Homekit.

![](/files/sMVtjjZ0JZCDImOV1FBl)

Vamos desplegar un contenedor docker con Homebridge, podemos hacerlo en nuestro equipo o en una RaspberryPi/NanoPi/Odroid...

Necesitamos tener instalado en la maquina, el servicio de docker.

```
sudo apt update
sudo apt upgrade -y
sudo apt install -y libffi-dev libssl-dev python3 python3-pip
sudo curl -sSL https://get.docker.com | sh
sudo usermod -aG docker pi
sudo apt install -y docker-compose
```

Ahora simplemente descargamos el repositorio.

```
git clone https://github.com/AzagraMac/homebridge.git
```

Con el repo ya en nuestro equipo, entramos en el directorio y levantamos el contenedor, la primera vez tardara un poco ya que tiene que descargar la imagen.

```
cd homebridge
docker-compose up -d
```

Podemos ver su log

```
docker logs homebridge
```

Cuando termine de descargar la imagen, desde el navegador, entramos en el dashboard.

```
http://IP_MAQUINA:9590
```

![](/files/Nk8oF7NSNt1WdiCJuGZf)

Datos de acceso:

```
user: admin
pass: admin
```


# Comprobar vulnerabilidades de imagenes docker

<figure><img src="/files/xAVhjTe9H7k9bmvaVwEl" alt=""><figcaption></figcaption></figure>

## Instalacion del ejecutable

```sh
curl --compressed https://static.snyk.io/cli/latest/snyk-linux -o snyk
chmod +x snyk
mv snyk /usr/local/bin/
```

Cambiamos la URL por la plataforma que vamos a usar

* **Linux**: <https://static.snyk.io/cli/latest/snyk-linux>
* **Linux/arm64**: <https://static.snyk.io/cli/latest/snyk-linux-arm64>
* **Alpine**: <https://static.snyk.io/cli/latest/snyk-alpine>
* **macOS**: <https://static.snyk.io/cli/latest/snyk-macos>

## Instalacion con hombrew (macOS)

```bash
brew tap snyk/tap
brew install snyk
```

## Instalacion con Scoop (Windows)

```powershell
scoop bucket add snyk https://github.com/snyk/scoop-snyk
scoop install snyk
```

\
En Linux, se necesita ademas un paquete adicional.

```sh
sudo apt install xdg-utils -y
```

Nos registramos en [snyk.io](https://snyk.io) y despues de configurar nuestra cuenta, podremos hacer login

```sh
snyk auth
```

Al ejecutarlo nos genera un link para el Auth

```sh
# snyk auth

Now redirecting you to our auth page, go ahead and log in,
and once the auth is complete, return to this prompt and you'll
be ready to start using snyk.

If you can't wait use this url:
https://app.snyk.io/login?token=XXXXXXXXXXXXXXXXXXXXXXXXXXXX&utm_medium=cli&utm_source=cli&utm_campaign=CLI_V1_PLUGIN&utm_campaign_content=1.1196.0&os=linux&docker=false

Your account has been authenticated. Snyk is now ready to be used.
```

Entramos en la URL y pinchamos en el boton

<figure><img src="/files/ekqn63Q4jQkYJOVnYeSx" alt=""><figcaption></figcaption></figure>

y ahora ya podremos hacer un test a nuestra imagen

```sh
snyk container test organizacion/imagen:latest
```

Ejemplo:

```sh
snyk container test azagramac/adguard:latest

Testing adguard/adguard:latest...

✗ Low severity vulnerability found in openssl/libcrypto3
  Description: CVE-2023-3446
  Info: https://security.snyk.io/vuln/SNYK-ALPINE318-OPENSSL-5788370
  Introduced through: openssl/libcrypto3@3.1.1-r1, apk-tools/apk-tools@2.14.0-r2, busybox/ssl_client@1.36.1-r0, ca-certificates/ca-certificates@20230506-r0, openssl/libssl3@3.1.1-r1
  From: openssl/libcrypto3@3.1.1-r1
  From: apk-tools/apk-tools@2.14.0-r2 > openssl/libcrypto3@3.1.1-r1
  From: busybox/ssl_client@1.36.1-r0 > openssl/libcrypto3@3.1.1-r1
  and 5 more...
  Image layer: 'apk --no-cache add ca-certificates libcap tzdata'
  Fixed in: 3.1.1-r3

✗ Medium severity vulnerability found in openssl/libcrypto3
  Description: Improper Authentication
  Info: https://security.snyk.io/vuln/SNYK-ALPINE318-OPENSSL-5776808
  Introduced through: openssl/libcrypto3@3.1.1-r1, apk-tools/apk-tools@2.14.0-r2, busybox/ssl_client@1.36.1-r0, ca-certificates/ca-certificates@20230506-r0, openssl/libssl3@3.1.1-r1
  From: openssl/libcrypto3@3.1.1-r1
  From: apk-tools/apk-tools@2.14.0-r2 > openssl/libcrypto3@3.1.1-r1
  From: busybox/ssl_client@1.36.1-r0 > openssl/libcrypto3@3.1.1-r1
  and 5 more...
  Image layer: 'apk --no-cache add ca-certificates libcap tzdata'
  Fixed in: 3.1.1-r2



Organization:      adguard
Package manager:   apk
Project name:      docker-image|adguard/adguard
Docker image:      adguard/adguard:latest
Platform:          linux/arm64
Licenses:          enabled

Tested 20 dependencies for known issues, found 2 issues.

Snyk wasn’t able to auto detect the base image, use `--file` option to get base image remediation advice.
Example: $ snyk container test adguard/adguard:latest --file=path/to/Dockerfile

To remove this message in the future, please run `snyk config set disableSuggestions=true`

-------------------------------------------------------

Testing adguard/adguard:latest...

Organization:      adguard
Package manager:   gomodules
Target file:       /opt/adguardhome/AdGuardHome
Project name:      github.com/AdguardTeam/AdGuardHome
Docker image:      adguard/adguard:latest
Licenses:          enabled

✔ Tested 121 dependencies for known issues, no vulnerable paths found.


Tested 2 projects, 1 contained vulnerable paths.
```

Pero aqui no acaba la cosa, tenemos un dashboard via web

Entramos <https://app.snyk.io/> con nuestras credenciales, y aqui podemos enlazar diferentes servicios y gestionar las imagenes.


# Sign docker images with Cosign

<figure><img src="/files/0ezp4MWHb9GwaNFjFrEf" alt=""><figcaption></figcaption></figure>

#### Prepare environment

```
sudo apt update && sudo apt install -y ca-certificates curl gnupg
```

```
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
```

```
sudo chmod a+r /etc/apt/keyrings/docker.gpg
```

```
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

```
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

```
sudo usermod -aG docker $USER
sudo systemctl enable docker.service
```

```
sync && sudo reboot
```

<figure><img src="/files/zvta9MQqKNhf1CRI8Enh" alt=""><figcaption></figcaption></figure>

#### Dockerfile (sample)

```docker
FROM openjdk:22-bookworm

COPY artifactId-web-0.0.1-SNAPSHOT-dev /artifactId-web-0.0.1-SNAPSHOT-dev

EXPOSE 8080
CMD ["/artifactId-web-0.0.1-SNAPSHOT-dev"]
```

#### Build image docker

```sh
docker build -t repository/my-image:tag .
```

#### View image docker

```sh
docker images
```

#### Run image docker

```sh
docker run -d -p 8080:8080 repository/my-image:tag --name my-image
```

#### View logs imagen docker

```sh
docker logs -f my-image
```

###

### Push image docker to Docker Hub

```sh
docker login
```

```sh
docker push repository/my-image:tag
```

###

### Sign image docker

<figure><img src="/files/00dphi6iE1lDFmFwsyxY" alt=""><figcaption></figcaption></figure>

Install cosign

<https://github.com/sigstore/cosign/releases>\
v2.2.0 latest

**Generate public/private keys**

```sh
cosign generate-key-pair
```

or

```sh
echo "your_password" | cosign generate-key-pair
```

Output

```sh
Enter password for private key:
Enter password for private key again:

Are you sure would like to continue [y/N]: y
Private key written to cosign.key
Public key written to cosign.pub
```

\
Option 1, **Image signature with private key**

```sh
 cosign sign --key cosign.key -a "author=AzagraMac" repository/my-image:tag
```

```sh
Enter password for private key:
WARNING: Image reference repository/my-image:tag uses a tag, not a digest, to identify the image to sign.
    This can lead you to sign a different image than the intended one. Please use a
    digest (example.com/ubuntu@sha256:abc123...) rather than tag
    (example.com/ubuntu:latest) for the input to cosign. The ability to refer to
    images by tag will be removed in a future release.

WARNING: "repository/my-image" appears to be a private repository, please confirm uploading to the transparency log at "https://rekor.sigstore.dev"
Are you sure you would like to continue? [y/N] y

        The sigstore service, hosted by sigstore a Series of LF Projects, LLC, is provided pursuant to the Hosted Project Tools Terms of Use, available at https://lfprojects.org/policies/hosted-project-tools-terms-of-use/.
        Note that if your submission includes personal data associated with this signed artifact, it will be part of an immutable record.
        This may include the email address associated with the account with which you authenticate your contractual Agreement.
        This information will be used for signing this artifact and will be stored in public transparency logs and cannot be removed later, and is subject to the Immutable Record notice at https://lfprojects.org/policies/hosted-project-tools-immutable-records/.

By typing 'y', you attest that (1) you are not submitting the personal data of any other person; and (2) you understand and agree to the statement and the Agreement terms at the URLs listed above.
Are you sure you would like to continue? [y/N] y
tlog entry created with index: 35833795
Pushing signature to: repository/my-image
```

\
Option 2, **Image signature using web token**

```sh
 cosign sign repository/my-image:tag
```

```sh
Generating ephemeral keys...
Retrieving signed certificate...

        The sigstore service, hosted by sigstore a Series of LF Projects, LLC, is provided pursuant to the Hosted Project Tools Terms of Use, available at https://lfprojects.org/policies/hosted-project-tools-terms-of-use/.
        Note that if your submission includes personal data associated with this signed artifact, it will be part of an immutable record.
        This may include the email address associated with the account with which you authenticate your contractual Agreement.
        This information will be used for signing this artifact and will be stored in public transparency logs and cannot be removed later, and is subject to the Immutable Record notice at https://lfprojects.org/policies/hosted-project-tools-immutable-records/.

By typing 'y', you attest that (1) you are not submitting the personal data of any other person; and (2) you understand and agree to the statement and the Agreement terms at the URLs listed above.
Are you sure you would like to continue? [y/N] y
error opening browser: exec: "xdg-open": executable file not found in $PATH
Go to the following link in a browser:

         https://oauth2.sigstore.dev/auth/auth?access_type=online&client_id=sigstore&code_challenge=aS3452hjb2iu324d65r652y3fc4&code_challenge_method=S256&nonce=2VHrAAZqX4qAerbvoo9volVdJ5B&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&scope=openid+email&state=s87TD7G6gv655d6imBbEXLcsNTm
Enter verification code: 
```

\
It generates a URL, to log in with our credentials

<figure><img src="/files/YDyIUqdzFIpxOmRJ7tYw" alt=""><figcaption></figcaption></figure>

and returns a verification token that must be copied to the terminal

<figure><img src="/files/XHFuKCfPPVU387bS8bgi" alt=""><figcaption></figcaption></figure>

and it will sign the image, it generates a new tag in the image that we have in the repository.

```sh
Successfully verified SCT...
WARNING: Image reference repository/my-image:tag uses a tag, not a digest, to identify the image to sign.
    This can lead you to sign a different image than the intended one. Please use a
    digest (example.com/ubuntu@sha256:abc123...) rather than tag
    (example.com/ubuntu:latest) for the input to cosign. The ability to refer to
    images by tag will be removed in a future release.

WARNING: "repository/my-image" appears to be a private repository, please confirm uploading to the transparency log at "https://rekor.sigstore.dev"
Are you sure you would like to continue? [y/N] y
tlog entry created with index: 35822795
Pushing signature to: repository/my-image
```

### Verify a Container’s signature

```sh
cosign verify --key cosign.pub repository/my-image
```

```json
Verification for name_repo.azurecr.io/my-image:tag --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - Existence of the claims in the transparency log was verified offline
  - The signatures were verified against the specified public key

[
   {
      "critical":{
         "identity":{
            "docker-reference":"repository/my-image"
         },
         "image":{
            "docker-manifest-digest":"sha256:d4a46b56ae9ff8ed1d09273ab1c9c9518228198d3467ecde"
         },
         "type":"cosign container image signature"
      },
      "optional":{
         "Bundle":{
            "SignedEntryTimestamp":"MEQCIFaOAj1tLMCepfD48OaxXnAsf2GWh3WtfkgpX1uA==",
            "Payload":{
               "body":"eyJhcGlWZXLjEiLCJraW5kIjoiaGFzaGVkcmVrf3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiJiYmEyYWNmODljYjc2MzA5NmJhMjA1ZTE4MzE1Y2NkNTQxODQ1MDMyOWYwOWY4ZjUwY2JmYWFjZjliZDk3OTE3In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUUQwTjNzU1RRalJoWUN2SStOYWNMNThaNVZjTGJkUnRWeFViZUQrenlxc2pnSWdDODhYZVVkQ0x0YTBrTjV6OWVITExkTUVJdy9rUE9nMTBwL1hhcHdWWjZjPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCUVZVSk1TVU1nUzBWWkxTMHRMUzBLVFVacmQwVjNXVWhMYjFwSmVtb3dRMEZSV1VsTGIxcEplbW93UkVGUlkwUlJaMEZGYmxkNVRuTkRjVWhsVVdGdFNsWmxjRkJIV2xaV1luVnNVRXRKVHdwSFVVSk5aWE0wVUZwVlUzQXpUVEUzYlVOSWJraHJjVzV6V1VaNFpHdFlkVlJxYjJWdlNUbHBURFJoVFZSUVNFnVUZWJRXRGV1MwdExTMHRDZz09In19fX0=",
               "integratedTime":1694407129,
               "logIndex":35822795,
               "logID":"c0d23d6ad606973f95594f98b9591801d"
            }
         },
         "author":"AzagraMac"
      }
   }
]
```


# Acceder a un contenedor con permisos de superusuario

Si queremos entrar en un contenedor con permisos de superusuario (root) ejecutaremos:

```
docker exec -it -u root NOMBRE_CONTENEDOR sh
```


# RaspberryPi


# Reducir tamaño imagen .img de un backup de la SD

Cuando hacemos un backup de la SD a un .img, pesan demasiado... pero podemos reducir el tamaño de la .img final\
\
Primero descargamos el script

```shell
wget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh
```

Le damos permisos de ejecución

```shell
chmod a+x pishrink.sh
```

Y lanzamos el script, pasando como parametro el fichero de la imgen .img

```shell
 sudo ./pishrink.sh imagen_raspberry.img
```

Finalmente nos dejara el .img con menos peso, para restaurar ese .img a la SD podemos usar el [RaspberryPi Imager](https://www.raspberrypi.com/software/)

<figure><img src="/files/3kqf5LXCw0TyjDV48eUJ" alt=""><figcaption></figcaption></figure>




---

[Next Page](/llms-full.txt/1)

