"Después del juego es antes del juego"
Sepp Herberger

jueves, 21 de enero de 2021

Preparando un dispositivo USB con arranque clonezilla e imágenes para restauración.

Siempre se me olvidan los pasos y tengo que andar mirando notas cuando me hace falta, así que voy a dejar aquí apuntados los métodos que tengo de crear un disco duro externo o pendrive autoarrancable con clonezilla y varias imágenes de disco.

Usaré clonezilla-live-2.5.5-38-amd64, que es el estándar que usamos en los centros educativos. Bajamos la versión amd64 en fichero zip mediante este enlace.

Asumirémos que el dispositivo USB está en la ruta /dev/sdd (con el comando "fdisk -l" podemos averiguar cual es el /dev/sdX que usa una vez pinchado en el puerto USB). A la hora de organizarlo tenemos dos opciones.
  1. Una única partición: se crea con gparted del tipo FAT32 y luego se formatea con:
    # mkfs.vfat -F 32 /dev/sdd1
  2. Usar dos particiones: con gparted creamos una (sdd1) con FAT32 de 256Mb o un poco mayor. El resto de disco con una partición (sdd2) de tipo NTFS o ext3/4 a la que pondremos la etiqueta "IMAGENES" para poder identificarla y montarla luego fácilmente. Una vez creadas las formateamos con:
    # mkfs.vfat -F 32 /dev/sdd1 
    # mkfs.ext3 /dev/sdd2
    # tune2fs –L IMAGENES /dev/sdd2
    
    o bien
    # mkfs.vfat -F 32 /dev/sdd1 
    # mkfs.ntfs /dev/sdd2
    # ntfslabel /dev/sdd2 IMAGENES
¿Qué diferencia hay entre poner una o dos particiones? Bueno, si ponemos una partición esta debe ser FAT32 por narices, con los límites de este formato (ficheros como mucho de 4GB y tamaño máximo de partición de 2TB). Además esa partición se monta de forma automática como "solo lectura", por tanto podemos restaurar imágenes pero no guardarlas en el dispositivo.

Con dos particiones, al ser la segunda extX o NTFS no tiene dichas limitaciones y además como la montamos en modo rw se puede tanto restaurar como guardar imágenes. Que cada cual elija su método favorito.

Una vez tenemos el disco con una o dos particiones preparado, lo conectamos y descomprimimos en la primera partición el fichero zip antes descargado, quedando la siguiente estructura de directorios dentro del mismo:
.
├── boot
│   └── grub
│       ├── efiboot.img
│       └── grub.cfg
├── Clonezilla-Live-Version
├── EFI
│   └── boot
│       ├── bootia32.efi
│       ├── bootx64.efi
│       ├── grub.cfg
│       ├── ocswp-grub2.png
│       └── unicode.pf2
├── GPL
├── home
│   └── partimag
├── live
│   ├── Clonezilla-Live-Version
│   ├── filesystem.packages
│   ├── filesystem.packages-remove
│   ├── filesystem.size
│   ├── filesystem.squashfs
│   ├── freedos.img
│   ├── initrd.img
│   ├── ipxe.efi
│   ├── ipxe.lkn
│   ├── memtest
│   └── vmlinuz
├── syslinux
│   ├── chain.c32
│   ├── drblwp.png
│   ├── isolinux.bin
│   ├── isolinux.cfg
│   ├── iso_sort.txt
│   ├── ldlinux.c32
│   ├── libcom32.c32
│   ├── libutil.c32
│   ├── memdisk
│   ├── menu.c32
│   ├── ocswp.png
│   ├── syslinux.cfg
│   └── vesamenu.c32
└── utils
    ├── linux
    │   ├── extlinux
    │   ├── makeboot.sh
    │   ├── syslinux
    │   └── VERSION.txt
    ├── mbr
    │   └── mbr.bin
    ├── README.txt
    ├── win32
    │   ├── makeboot.bat
    │   ├── syslinux.exe
    │   └── VERSION.txt
    └── win64
        ├── makeboot64.bat
        ├── syslinux64.exe
        └── VERSION.txt

13 directories, 45 files
Ahora hay que configurarlo como autoarrancable, eso lo hacemos con los comandos:
# cd /ruta/pendrive/utils/linux
# bash makeboot.sh /dev/sdd1
Con esto, ya tenemos el disco arrancable. Ahora hay que meter la imágenes clonezilla (recordemos que cada imagen de disco va un un subdirectorio separado) que queremos usar:
  1. Si usamos una partición, metemos las imágenes en el directorio /home/partimag de sdd1.
  2. Si usamos dos particiones, metemos las imágenes en el directorio raíz de sdd2
Por defecto, al arrancar clonezilla la primera partición del pendrive se monta en modo solo-lectura sobre /lib/live/mount/medium. Cuando se carga el programa principal (ocs-live-general) se enlaza /home/partimag sobre /lib/live/mount/medium/home/partimag. De esta manera, si al llegar al menú de selección de /home/partimag le decimos que use el ya existente (opción Skip) tendremos acceso directo a las imágenes allí contenidas.


El problema es cuando nuestras imágenes están en una partición distinta a sdd1. Podemos usar la opción "local_dev" de la captura anterior para montar dicha partición a mano o bien indicar en el arranque que se monte automáticamente. Para esto último debemos editar el fichero grub.cfg. Este fichero se guarda en la ruta EFI/boot/grub.cfg de la primera partición. Allí tendremos una serie de entradas como:
menuentry "Clonezilla live (Default settings, VGA 800x600)"{
  search --set -f /live/vmlinuz
  linux /live/vmlinuz boot=live union=overlay username=user config components quiet noswap edd=on nomodeset noeject locales= keyboard-layouts= ocs_live_run="ocs-live-general" ocs_live_extra_param="" ocs_live_batch="no" vga=788 ip= net.ifnames=0  splash i915.blacklist=yes radeonhd.blacklist=yes nouveau.blacklist=yes vmwgfx.enable_fbdev=1
  initrd /live/initrd.img
}
En esa entrada habría que añadir el comando:
ocs_prerun="mount -L IMAGENES /home/partimag"
El cual, efectivamente, monta la partición etiquetada como IMAGENES en la ruta /home/partimag antes de entrar en el programa general de clonezilla que, como podemos ver, se llama "ocs_live_general".

El resultado final es:
menuentry "Clonezilla live (Default settings, VGA 800x600)"{
  search --set -f /live/vmlinuz
  linux /live/vmlinuz boot=live union=overlay username=user config components quiet noswap edd=on nomodeset noeject locales= keyboard-layouts= ocs_prerun="mount -L IMAGENES /home/partimag" ocs_live_run="ocs-live-general" ocs_live_extra_param="" ocs_live_batch="no" vga=788 ip= net.ifnames=0  splash i915.blacklist=yes radeonhd.blacklist=yes nouveau.blacklist=yes vmwgfx.enable_fbdev=1
  initrd /live/initrd.img
}
De esta manera, al arrancar ya tendremos en /home/partimag las imágenes contenidas en la segunda partición del disco. Tan solo hay que escoger "Skip/Saltar: use existing /home/partimag" al llegar al llegar al menú de selección de /home/partimag.

Con esto tenemos resuelta la cuestión de tener un dispositivo que contenga tanto el clonezilla como las imágenes. Otra cosa que muchas veces se necesita es una opción que cargue una imagen de forma automática, sin intervención humana. En ese caso añadimos a EFI/boot/grub.cfg una opción como:
menuentry "Clonezilla restauracion automática imagen backup-dep"{
  search --set -f /live/vmlinuz
  linux /live/vmlinuz boot=live config components union=overlay noswap edd=on nomodeset noprompt ocs_prerun="mount -L IMAGENES /home/partimag" ocs_postrun="sudo shutdown -r now" ocs_live_run="ocs-live-restore" ocs_live_extra_param=" -e1 auto -e2 -r -j2 -scr -p true restoredisk backup-dep sda" keyboard-layouts="es" ocs_live_batch="yes" locales="es_ES.UTF-8" vga=791 ip=frommedia nosplash
  initrd /live/initrd.img
}
Que coge la imagen "backup-dep" desde la partición IMAGENES del dispositivo y la restaura en la unidad de disco duro /dev/sda, apagando el ordenador al finalizar. El truco está en:
ocs_live_run="ocs-live-restore" 
ocs_live_extra_param=" -e1 auto -e2 -r -j2 -scr -p true restoredisk backup-dep sda"}
Para cambiar el nombre de la imagen o el disco destino solo hay que modificar el fragmento "backup-dep sda". La explicación del resto de parámetros podemos encontrarla en este post del blog de mi compañero Esteban.


Seguimos para bingo con SpaceX, ya tenemos un Falcon 9 que ha sido utilizado 8 veces sin problemas. Esta vez ha aterrizado en la barcaza "Just Read The Instructions", con malas condiciones de viento y mar. Ha colocado en órbita otros 60 satélites Starlink, por lo que ya tenemos 1015 subidos para proporcionar Internet desde la órbita baja.
Según he leído en algún sitio, ya se han lanzado mas Falcon 9 que cualquier otro tipo de cohete en la historia. Y luego hay conspiranoicos que dicen que todo es CGI...

jueves, 7 de enero de 2021

Haciendo funcionar un dispositivo wifi USB Mediatek MT7601U en Linux.

Tengo un pincho USB wifi regalado que al probarlo no me funcionó en Linux. El sistema no creaba el dispositivo de red wifi al conectarlo. Su identificación USB es:
# lsusb | gre0 -i wireless
Bus 001 Device 003: ID 148f:7601 Ralink Technology, Corp. MT7601U Wireless Adapter
Lo curioso es que el driver mt7601u.ko si existe para Linux hace tiempo. En el caso de Manjaro tuve que instalarlo con:
$ pamac build  mt7601u-dkms-git
Una vez creado el módulo verifico que se carga en memoria:
# lsmod | grep mt
mt7601u               139264  0
mac80211             1110016  1 mt7601u
cfg80211              987136  2 mt7601u,mac80211
Pero nada, no funciona: no hay dispostivo wifi. Miro el log y veo estos errores recurrentemente:
   90.682395] mt7601u 1-1.1:1.0: ASIC revision: 76010001 MAC revision: 76010500
[   90.684079] mt7601u 1-1.1:1.0: Firmware Version: 0.1.00 Build: 7640 Build time: 201302052146____
[   91.066394] mt7601u 1-1.1:1.0: EEPROM ver:0c fae:00
[   91.232416] mt7601u 1-1.1:1.0: Error: MCU resp urb failed:-71
[   91.232420] mt7601u 1-1.1:1.0: Error: MCU resp evt:0 seq:5-4!
[   91.236894] mt7601u 1-1.1:1.0: Error: MCU resp urb failed:-71
[   91.236897] mt7601u 1-1.1:1.0: Error: MCU resp evt:0 seq:5-4!
[   91.241147] mt7601u 1-1.1:1.0: Error: MCU resp urb failed:-71
[   91.241150] mt7601u 1-1.1:1.0: Error: MCU resp evt:0 seq:5-4!
[   91.245395] mt7601u 1-1.1:1.0: Error: MCU resp urb failed:-71
[   91.245398] mt7601u 1-1.1:1.0: Error: MCU resp evt:0 seq:5-4!
[   91.249689] mt7601u 1-1.1:1.0: Error: MCU resp urb failed:-71
[   91.249692] mt7601u 1-1.1:1.0: Error: MCU resp evt:0 seq:5-4!
[   91.249694] mt7601u 1-1.1:1.0: Error: mt7601u_mcu_wait_resp timed out
[   91.439297] mt7601u 1-1.1:1.0: Vendor request req:07 off:0080 failed:-71
[   91.605971] mt7601u 1-1.1:1.0: Vendor request req:02 off:0080 failed:-71
[   91.772616] mt7601u 1-1.1:1.0: Vendor request req:02 off:0080 failed:-71
[   91.772671] mt7601u: probe of 1-1.1:1.0 failed with error -110
Buscando en Internet encuentro esta solución. Los pasos descritos son:

1) Descargamos el código fuente del driver:
# wget -O master.zip https://codeload.github.com/jeremyb31/mt7601u-5.3/zip/master
# unzip -x master.zip
2) Entramos en el directorio mt7601u-5.3-master y modificamos a mano el fichero phy.c en los lugares indicados:
En la función mt7601u_init_cal() comentar las líneas:
      // ret = mt7601u_mcu_calibrate(dev, MCU_CAL_RXIQ, 0);
      // if (ret)
      // return ret;
      // ret = mt7601u_mcu_calibrate(dev, MCU_CAL_DPD, dev->dpd_temp);
      // if (ret)
      // return ret;
En la función mt7601u_phy_recalibrate_after_assoc() comentar las línea:
      // mt7601u_mcu_calibrate(dev, MCU_CAL_DPD, dev->curr_temp);
3) Guardamos y compilamos para crear un fichero mt7601u.ko nuevo con los parches aplicados:
# make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
4) Una vez hecho esto quitamos el pincho del puerto USB y descargamos el driver de la memoria:
# rmmod mt7601u
5) Cargamos el módulo nuevo y pinchamos el USB otra vez:
# insmod ./mt7601u.ko
Ahora si que se detecta la tarjeta wifi:
# iwconfig
lo        no wireless extensions.

eno1      no wireless extensions.

wlp0s26u1u1  IEEE 802.11  ESSID:"WLAN_985A3D"  
          Mode:Managed  Frequency:2.462 GHz  Access Point: 78:81:02:02:AB:F1   
          Bit Rate=57.8 Mb/s   Tx-Power=20 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=49/70  Signal level=-61 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:128  Invalid misc:1890   Missed beacon:0
Por último solo hay que ponerlo en la ruta del driver original, para que se cargue en cada arranque de forma automática. Para saber la ubicación adecuada del fichero, reiniciamos la máquina y hacemos:
# modinfo mt7601u | grep -i filename
filename:       /lib/modules/5.10.2-2-MANJARO/kernel/drivers/net/wireless/mt7601u.ko.xz
En mi caso la ruta es /lib/modules/5.10.2-2-MANJARO/kernel/drivers/net/wireless/mt7601u.ko.xz. Comovvemos, está ademas comprimido con formato .xz. Haremos:
# mv /lib/modules/5.10.2-2-MANJARO/kernel/drivers/net/wireless/mt7601u.ko.xz /lib/modules/5.10.2-2-MANJARO/kernel/drivers/net/wireless/mt7601u.ko.xz.bak
# cp mt7601u.ko /lib/modules/5.10.2-2-MANJARO/kernel/drivers/net/wireless/mt7601u.ko
# cd /lib/modules/5.10.2-2-MANJARO/kernel/drivers/net/wireless
# xz mt7601u.ko
Y listo, ya todo queda funcionando. Tan solo recordar que si actualizamos el kernel tendremos que repetir estos pasos para regenerar el driver parcheado.