lunes, marzo 22, 2021

Support for HSP/HFP headset profiles on Ubuntu and Debian

A few months ago I was given a "remote work toolset" that includes a bluetooth headset simply referred as "EC717". To be honest, they come in handy for me, because I was using the hands-free kit of my phone, and it is not the same in quality or comfort.

However, I found it impossible to get them to work on Ubuntu 20.04 and Debian 10, two of the platforms that I regularly use. They do work for listening to music, as A2DP profile, but they don't work as a microphone for video calls, thus losing their main function. When trying to set the profile from a2dp_sink to headset_head_unit, I get this error:

W: [pulseaudio] module-bluez5-device.c: Refused to switch profile to headset_head_unit: Not connected

This issue is extensively documented in lots of bugs and pulseaudio tickets at bugs.freedesktop.org (93898, 9731673325) and in the new gitlab.freedesktop.org (84, 122, 742, 776, 960).

In short, there's no complete support for the variety of HandSet Profile / Hands Free Profile / HSP&HFP profiles by which the audio and control channels are coordinated in Bluetooth. Actually there was support, but changes to the architecture of Bluez and PulseAudio made it disappear. And this affects some headsets that implement only one of these profiles.

Around 2017, James Bottomley coded support for those profiles in pulseaudio 11, 12 and 13, but unfortunately those patches were not incorporated into the stable branch of the pulseaudio library when he published them, and they were only added a few days ago, thus they are not available in current releases of modern distributions.

Fortunately, he segmented two branches of work in which he neatly documents the code changes in order to make this type of headsets work with pulseaudio 12 and pulseaudio 13, and from them I was able to modify and compile two versions of the pulseaudio-module-bluetooth package with HSP/HFP support for both Debian and Ubuntu:

By the way, and before you complain, according to the Bluetooth specification the HSP/HFP profile is single channel (mono) and in 8 khz (Volume 2, Section 6.12, of the Bluetooth Core 2.0 specification), so the audio quality is similar to that of a landline phone (well, that's the spirit of HSP). In short, it sounds awful just like an analog phone. If you want to listen to music, use the A2DP profile, but with this profile it is not possible to use the headset as a microphone. Newer versions of the patch bring support for multiple codecs that improve audio quality, but of course these improvements are only available on newer, higher-quality hardware.

As for me, I also opted to make a passthru module using python3-bluez and pulseaudio virtual sources/sinks, in a script of about 600 lines, so as to communicate directly with the headset and pass the audio as new inputs and outputs on the pulseaudio stack, but the latency it added to the spoken voice made it unusable. Bottomley patches, on the other hand, worked great.

Finally, regarding code quality, if you've worked on SCSI, Secure Boot, TPMs and UEFI, then there is a very high probability that you've come across James code. So, James, cheers to you!

Soporte para headsets HSP/HFP en Ubuntu y Debian

Hace unos meses me obsequiaron un set de trabajo remoto que incluye unos auriculares bluetooth denominados simplemente "EC717". La verdad que me vienen muy bien, pues estaba utilizando el manos libres del celular, y no es lo mismo en calidad ni comodidad.

Sin embargo, encontré imposible hacerlos funcionar en Ubuntu 20.04 y en Debian 10, dos de las plataformas que utilizo habitualmente. En realidad sí funcionan para escuchar música, con el perfil A2DP, pero no funcionan como micrófono para videollamadas, con lo cual pierde bastante el sentido de ser un "set de trabajo remoto". Al intentar establecer el perfil de a2dp_sink a headset_head_unit, obtengo este error:

W: [pulseaudio] module-bluez5-device.c: Refused to switch profile to headset_head_unit: Not connected

Este problema está documentado ampliamente en un montón de bugs y tickets de pulseaudio en bugs.freedesktop.org (93898, 9731673325) y en el nuevo gitlab.freedesktop.org (84, 122, 742, 776, 960

Básicamente, no hay soporte completo para la variedad de HandSet Profile / Hands Free Profile / HSP&HFP profiles mediante los cuales se coordinan los canales de audio y control en Bluetooth. En realidad lo había, pero cambios en la arquitectura de Bluez y PulseAudio hicieron que desaparezcan. Y esto afecta de forma variada a algunos headset que implementan uno solo de dichos perfiles.

James Bottomley estuvo trabajando en 2017 en la incorporación de soporte para las versiones de pulseaudio 11, 12 y 13, pero lamentablemente esos parches no llegaron a incorporarse a la rama estable de la biblioteca pulseaudio cuando los publicó, y recién fueron incorporados hace pocos días, con lo cual no figuran ni de casualidad en las releases actuales de las distribuciones modernas.

Afortunadamente, él ha segmentado dos ramas de trabajo en las cuales marca prolijamente cuales son los cambios a incorporar para poder hacer andar este tipo de headsets con pulseaudio 12 y pulseaudio 13 , y a partir de ellos pude modificar y compilar dos versiones del paquete pulseaudio-module-bluetooth con soporte para HSP/HFP tanto en Debian como en Ubuntu:

Por cierto, y antes de que se quejen, el perfil HSP/HFP según la especificación Bluetooth es monocanal y en 8 khz (Volume 2, Section 6.12, de la especificación Bluetooth Core 2.0), por lo cual la calidad de audio es similar a la de un teléfono de línea (bueno, que en espíritu eso es HSP). En resumen, se escucha feo como en un teléfono analógico. Si quieren escuchar música, establezcan perfil A2DP, pero con ese perfil no es posible utilizar el headset como micrófono. Las versiones más nuevas del parche incorporan soporte para múltiples codecs que mejoran la calidad de audio, pero desde luego estas mejoras sólo están disponibles en hardware más moderno y de mejor calidad.

Por mi parte, también opté por hacer un passthru mediante python3-bluez y sources/sinks virtuales de pulseaudio, un script de unas 600 líneas, de forma tal de dialogar directamente con el headset y pasar el audio como entradas y salidas nuevas en el stack de la biblioteca de sonido, pero la latencia que incorporaba al sonido lo hacía inusable. Los parches de Bottomley, en cambio, funcionan perfecto.

Finalmente, respecto a la calidad del código, si estuvieron trabajando en cuestiones de SCSI, Secure Boot, TPMs y UEFI, hay una muy alta probabilidad de que estén utilizando y se hayan cruzado con código de James. Va mi agradecimiento por todos sus aportes.  

miércoles, octubre 09, 2019

Kernels nuevos en Debian Buster

Continuando con la serie de posts con versiones estables, en este artículo publico la última versión disponible del kernel de Linux, compilada, empaquetada y fácilmente instalable como .deb sobre cualquier sistema Debian GNU/Linux 10 Buster de 64 bits sin quilombo de dependencias.

En cada directorio encontrarán los paquetes con la imagen del kernel, los encabezados, el changelog y la configuración utilizada en la compilación, que está basada en la configuración publicada de Debian.
Si les interesa saber qué hay de nuevo, les dejo el link al post sobre novedades del kernel en Phoronix y el clásico resumen hecho por la gente de KernelNewbies.

A medida que vayan saliendo nuevas versiones iré actualizando este pequeño “repositorio” para mantenerlo al día.

jueves, agosto 15, 2019

Una noche de genios (salvo por el jurado)

El viernes 9 de agosto pasado, la agrupación de Hockey Masculino del Luján Rugby Club organizó en el Salón del Rotary Club Juan Barnech una “Noche de Mente” con el fin de recaudar fondos para costear el traslado del equipo de hockey juvenil Vikinguitos a una competencia en Mar del Plata.

Para quienes no han oído hablar de este tipo de encuentros, una “Noche de Mente”, más conocida como “Noche de Genios”, es un evento a beneficio de una agrupación o institución en el cual distintos grupos de amigos / familiares conforman equipos o “mesas” que compiten entre sí respondiendo preguntas en distintas rondas, donde cada ronda trata sobre una temática particular tal como deportes, cine y televisión, literatura, música, biología, historia, cultura general, etc. Aquellos que responden correctamente suman puntos y la mesa que más puntos acumula se corona ganadora de la noche.

La tarjeta de participación tiene un costo simbólico que, en conjunto con las donaciones de distintos comercios y lo obtenido de la venta en cantina, aporta a un fondo común del que salen los premios y, fundamentalmente, la recaudación para la cual fue organizado el evento. En general, los organizadores y quienes trabajan en pos de ello son los miembros de la misma institución, sus padres, familiares y amigos. En Luján suelen realizarse con frecuencia, llevadas adelante por promociones de escuelas, grupos deportivos y agrupaciones sociales.

El fin último es colaborar con una institución reconocida y en pos de un buen motivo. También, desde luego, pasar una noche divertida con amigos y conocidos.

Así transcurrió la noche del viernes, con una concurrencia completa, con buena atención por parte de los jóvenes de la agrupación, con una sana y animada competencia entre mesas amigas. Así transcurrió hasta el momento del anuncio de los resultados.

Es que, sorprendentemente, el jurado anunció como ganadora a la mesa equivocada, cuyo puntaje acumulado es matemáticamente imposible de obtener según los anuncios de conteos parciales que el mismo anfitrión realizó durante distintos momentos de la noche. Se lo digo de otra forma: ni siquiera teniendo calificación perfecta en todas las rondas restantes, dicha mesa podía haber obtenido el puntaje que fue asignado por el jurado. Para peor, el anfitrión anunció que la mesa había ganado "por más de 40 puntos" sobre el resto, según sus palabras.  Un error del que quien operaba la locución podría haberse percatado inmediatamente si hubiera prestado la mínima atención a las rondas anteriores.

Durante el cierre del evento, nos acercamos con un participante amigo a consultar respecto de la validez de los resultados. No quedaba ninguno de los jurados –que se ausentaron rápidamente, por lo visto–, pero sí uno de los organizadores del juego. Sin saber cómo se realizaron los cálculos, hizo lo posible para comprender la cadena de errores que habían cometido:
  1. El jurado cometió un error al calcular el puntaje de la mesa “ganadora”, sumando dos veces la calificación de las primeras rondas, con lo cual arribaba a un resultado muy superior –y errado– al del resto de los competidores. Sumando correctamente los valores de la planilla de resultados del jurado, el puntaje real de la mesa ganadora no alcanzaba el mínimo necesario para estar entre los primeros tres puestos del encuentro.
  2. Quien realizó el control de las respuestas de la anteúltima ronda, intercambió el puntaje de dos mesas. Nuestras respuestas correctas, cotejadas contra lo mencionado al final de la ronda 9, eran 17, mientras que en la planilla de resultado figuraban sólo 6 puntos. Esos 17 puntos figuraban asignados a la mesa de la columna inmediatamente anterior.
  3. La forma en que la organización podría haber validado o refutado lo mencionado en el punto anterior es con la revisión de la hoja de respuestas de cada mesa. Curiosamente, la única hoja de respuestas que faltaba era la correspondiente a nuestra mesa. “Parece como si lo hubiéramos hecho a propósito” dijo quien atendió nuestro reclamo. En efecto, parece como si lo hubieran hecho a propósito.
  4. Finalmente, no se anunciaron los puntajes de las últimas rondas. De haberlo hecho, los tres errores previamente mencionados podrían haberse advertido y resuelto en el momento.
Una Noche de Genios es un encuentro donde se premia a quienes responden correctamente.
¿Qué validez puede tener, entonces, la corrección de un jurado que se equivoca al otorgar el primer premio?

Podría decirse “errar es humano” o “es un juego, no deberías tomártelo tan a pecho”. Si una situación similar se diera en un partido de hockey, ¿no habría la agrupación competidora presentado una queja formal?

Es cierto, errar es humano, como también es humano reconocer los propios errores. Lo primero sucedió. Ahora estoy esperando una disculpa pública por parte de la organización.

Por lo pronto, van dos recomendaciones para las próximas noches de genios, que son de especial interés si la tarjeta dice “Agrupación de Hockey Masculino del Luján Rugby Club”:
  • Si está del lado de la organización: revise las hojas de resultados entre dos o más personas; anuncie las respuestas correctas al finalizar cada juego y los puntos asignados a cada mesa; realice revisión por pares de las sumas de puntajes; y si se le complican las sumas, ¡use Excel, por el amor de Dios!
  • Si participa en una noche de genios: controle las sumas de su propia mesa y controle además los puntajes de las demás. Nunca se sabe si el jurado que le tocó en la noche se llevó matemáticas a marzo.
Para finalizar, sólo deseo que los Vikinguitos tengan mejor suerte. Que lleven adelante un excelente encuentro en Mar del Plata, compitiendo con ansias y con garra.

Y espero, más que nada, que puedan traerse un merecido trofeo, en vez de volver a Luján desilusionados con una victoria-que-no-fue porque la organización se equivocó al sumar los puntos del partido.

Mauro A. Meloni

viernes, septiembre 14, 2018

Benchmark day 4: Toshiba 3.5" DT01ACA 1TB (DT01ACA100)

Esta es la cuarta entrega de la serie de pruebas a discos rígidos y SSDs, motivada por una reciente actualización de la estación de trabajo. Siguen las especificaciones y más abajo los resultados por si a alguno le interesa.

Toshiba 3.5" DT01ACA
Modelo: TOSHIBA DT01ACA100
Capacidad: 1 TB
Interfaz: SATA III
Caché: 31 MiB (aprox 24 MB)
Velocidad: 7200 RPM
Tamaño de sector: 4K físico, 512 lógico
# hdparm -I /dev/sda:
ATA device, with non-removable media
 Model Number:       TOSHIBA DT01ACA100
 Serial Number:      [REDACTED]
 Firmware Revision:  MS2OA750
 Transport:          Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6, SATA Rev 3.0; Revision: ATA8-AST T13 Project D1697 Revision 0b
Standards:
 Used: unknown (minor revision code 0x0029) 
 Supported: 8 7 6 5 
 Likely used: 8
Configuration:
 Logical  max current
 cylinders 16383 16383
 heads  16 16
 sectors/track 63 63
 --
 CHS current addressable sectors:    16514064
 LBA    user addressable sectors:   268435455
 LBA48  user addressable sectors:  1953525168
 Logical  Sector size:                   512 bytes
 Physical Sector size:                  4096 bytes
 Logical Sector-0 offset:                  0 bytes
 device size with M = 1024*1024:      953869 MBytes
 device size with M = 1000*1000:     1000204 MBytes (1000 GB)
 cache/buffer size  = 23652 KBytes (type=DualPortCache)
 Form Factor: 3.5 inch
 Nominal Media Rotation Rate: 7200
Capabilities:
 LBA, IORDY(can be disabled)
 Queue depth: 32
 Standby timer values: spec'd by Standard, no device specific minimum
 R/W multiple sector transfer: Max = 16 Current = 16
 Advanced power management level: disabled
 DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
      Cycle time: min=120ns recommended=120ns
 PIO: pio0 pio1 pio2 pio3 pio4 
      Cycle time: no flow control=120ns  IORDY flow control=120ns
Commands/features:
 Enabled Supported:
    * SMART feature set
      Security Mode feature set
    * Power Management feature set
    * Write cache
    * Look-ahead
    * Host Protected Area feature set
    * WRITE_BUFFER command
    * READ_BUFFER command
    * NOP cmd
    * DOWNLOAD_MICROCODE
      Advanced Power Management feature set
      Power-Up In Standby feature set
    * SET_FEATURES required to spinup after power up
      SET_MAX security extension
    * 48-bit Address feature set
    * Device Configuration Overlay feature set
    * Mandatory FLUSH_CACHE
    * FLUSH_CACHE_EXT
    * SMART error logging
    * SMART self-test
      Media Card Pass-Through
    * General Purpose Logging feature set
    * WRITE_{DMA|MULTIPLE}_FUA_EXT
    * 64-bit World wide name
    * URG for READ_STREAM[_DMA]_EXT
    * URG for WRITE_STREAM[_DMA]_EXT
    * WRITE_UNCORRECTABLE_EXT command
    * {READ,WRITE}_DMA_EXT_GPL commands
    * Segmented DOWNLOAD_MICROCODE
      unknown 119[7]
    * Gen1 signaling speed (1.5Gb/s)
    * Gen2 signaling speed (3.0Gb/s)
    * Gen3 signaling speed (6.0Gb/s)
    * Native Command Queueing (NCQ)
    * Host-initiated interface power management
    * Phy event counters
    * NCQ priority information
      Non-Zero buffer offsets in DMA Setup FIS
    * DMA Setup Auto-Activate optimization
      Device-initiated interface power management
      In-order data delivery
    * Software settings preservation
    * SMART Command Transport (SCT) feature set
    * SCT Write Same (AC2)
    * SCT Error Recovery Control (AC3)
    * SCT Features Control (AC4)
    * SCT Data Tables (AC5)
Security: 
 Master password revision code = 65534
  supported
 not enabled
 not locked
  frozen
 not expired: security count
 not supported: enhanced erase
 156min for SECURITY ERASE UNIT.
Logical Unit WWN Device Identifier: [REDACTED]
 NAA  : 5
 IEEE OUI : 000039
 Unique ID : [REDACTED]
Checksum: correct

# smartctl -x /dev/sda
smartctl 6.6 2016-05-31 r4324 [x86_64-linux-4.17.0-0.bpo.1-amd64] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     Toshiba 3.5" DT01ACA... Desktop HDD
Device Model:     TOSHIBA DT01ACA100
Serial Number:    [REDACTED]
LU WWN Device Id: [REDACTED]
Firmware Version: MS2OA750
User Capacity:    1.000.204.886.016 bytes [1,00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    7200 rpm
Form Factor:      3.5 inches
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ATA8-ACS T13/1699-D revision 4
SATA Version is:  SATA 3.0, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Wed Aug  8 11:48:00 2018 -03
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
AAM feature is:   Unavailable
APM feature is:   Disabled
Rd look-ahead is: Enabled
Write cache is:   Enabled
ATA Security is:  Disabled, frozen [SEC2]
Wt Cache Reorder: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x84) Offline data collection activity
     was suspended by an interrupting command from host.
     Auto Offline Data Collection: Enabled.
Self-test execution status:      (   0) The previous self-test routine completed
     without error or no self-test has ever 
     been run.
Total time to complete Offline 
data collection:   ( 7167) seconds.
Offline data collection
capabilities:     (0x5b) SMART execute Offline immediate.
     Auto Offline data collection on/off support.
     Suspend Offline collection upon new
     command.
     Offline surface scan supported.
     Self-test supported.
     No Conveyance Self-test supported.
     Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
     power-saving mode.
     Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
     General Purpose Logging supported.
Short self-test routine 
recommended polling time:   (   1) minutes.
Extended self-test routine
recommended polling time:   ( 120) minutes.
SCT capabilities:         (0x003d) SCT Status supported.
     SCT Error Recovery Control supported.
     SCT Feature Control supported.
     SCT Data Table supported.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAGS    VALUE WORST THRESH FAIL RAW_VALUE
  1 Raw_Read_Error_Rate     PO-R--   100   100   016    -    0
  2 Throughput_Performance  P-S---   142   142   054    -    71
  3 Spin_Up_Time            POS---   116   116   024    -    191 (Average 203)
  4 Start_Stop_Count        -O--C-   100   100   000    -    13
  5 Reallocated_Sector_Ct   PO--CK   100   100   005    -    0
  7 Seek_Error_Rate         PO-R--   100   100   067    -    0
  8 Seek_Time_Performance   P-S---   115   115   020    -    34
  9 Power_On_Hours          -O--C-   100   100   000    -    145
 10 Spin_Retry_Count        PO--C-   100   100   060    -    0
 12 Power_Cycle_Count       -O--CK   100   100   000    -    13
192 Power-Off_Retract_Count -O--CK   100   100   000    -    13
193 Load_Cycle_Count        -O--C-   100   100   000    -    13
194 Temperature_Celsius     -O----   206   206   000    -    29 (Min/Max 19/33)
196 Reallocated_Event_Count -O--CK   100   100   000    -    0
197 Current_Pending_Sector  -O---K   100   100   000    -    0
198 Offline_Uncorrectable   ---R--   100   100   000    -    0
199 UDMA_CRC_Error_Count    -O-R--   200   200   000    -    0
                            ||||||_ K auto-keep
                            |||||__ C event count
                            ||||___ R error rate
                            |||____ S speed/performance
                            ||_____ O updated online
                            |______ P prefailure warning

General Purpose Log Directory Version 1
SMART           Log Directory Version 1 [multi-sector log support]
Address    Access  R/W   Size  Description
0x00       GPL,SL  R/O      1  Log Directory
0x01           SL  R/O      1  Summary SMART error log
0x03       GPL     R/O      1  Ext. Comprehensive SMART error log
0x04       GPL     R/O      7  Device Statistics log
0x06           SL  R/O      1  SMART self-test log
0x07       GPL     R/O      1  Extended self-test log
0x08       GPL     R/O      2  Power Conditions log
0x09           SL  R/W      1  Selective self-test log
0x10       GPL     R/O      1  SATA NCQ Queued Error log
0x11       GPL     R/O      1  SATA Phy Event Counters log
0x20       GPL     R/O      1  Streaming performance log [OBS-8]
0x21       GPL     R/O      1  Write stream error log
0x22       GPL     R/O      1  Read stream error log
0x80-0x9f  GPL,SL  R/W     16  Host vendor specific log
0xe0       GPL,SL  R/W      1  SCT Command/Status
0xe1       GPL,SL  R/W      1  SCT Data Transfer

SMART Extended Comprehensive Error Log Version: 1 (1 sectors)
No Errors Logged

SMART Extended Self-test Log Version: 1 (1 sectors)
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

SCT Status Version:                  3
SCT Version (vendor specific):       256 (0x0100)
SCT Support Level:                   1
Device State:                        SMART Off-line Data Collection executing in background (4)
Current Temperature:                    29 Celsius
Power Cycle Min/Max Temperature:     29/31 Celsius
Lifetime    Min/Max Temperature:     19/33 Celsius
Under/Over Temperature Limit Count:   0/0

SCT Temperature History Version:     2
Temperature Sampling Period:         1 minute
Temperature Logging Interval:        1 minute
Min/Max recommended Temperature:      0/60 Celsius
Min/Max Temperature Limit:           -40/70 Celsius
Temperature History Size (Index):    128 (61)

Index    Estimated Time   Temperature Celsius
  62    2018-08-08 09:41    30  ***********
 ...    ..( 19 skipped).    ..  ***********
  82    2018-08-08 10:01    30  ***********
  83    2018-08-08 10:02     ?  -
 ...    ..(  4 skipped).    ..  -
  88    2018-08-08 10:07     ?  -
  89    2018-08-08 10:08    31  ************
 ...    ..( 11 skipped).    ..  ************
 101    2018-08-08 10:20    31  ************
 102    2018-08-08 10:21    30  ***********
 ...    ..(  6 skipped).    ..  ***********
 109    2018-08-08 10:28    30  ***********
 110    2018-08-08 10:29    29  **********
 ...    ..(  7 skipped).    ..  **********
 118    2018-08-08 10:37    29  **********
 119    2018-08-08 10:38    30  ***********
 ...    ..(  2 skipped).    ..  ***********
 122    2018-08-08 10:41    30  ***********
 123    2018-08-08 10:42    31  ************
 ...    ..( 11 skipped).    ..  ************
   7    2018-08-08 10:54    31  ************
   8    2018-08-08 10:55    30  ***********
 ...    ..(  5 skipped).    ..  ***********
  14    2018-08-08 11:01    30  ***********
  15    2018-08-08 11:02    29  **********
 ...    ..(  5 skipped).    ..  **********
  21    2018-08-08 11:08    29  **********
  22    2018-08-08 11:09    30  ***********
  23    2018-08-08 11:10    30  ***********
  24    2018-08-08 11:11    30  ***********
  25    2018-08-08 11:12    29  **********
  26    2018-08-08 11:13    29  **********
  27    2018-08-08 11:14    30  ***********
  28    2018-08-08 11:15    29  **********
 ...    ..( 11 skipped).    ..  **********
  40    2018-08-08 11:27    29  **********
  41    2018-08-08 11:28    30  ***********
 ...    ..(  2 skipped).    ..  ***********
  44    2018-08-08 11:31    30  ***********
  45    2018-08-08 11:32    29  **********
 ...    ..( 15 skipped).    ..  **********
  61    2018-08-08 11:48    29  **********

SCT Error Recovery Control:
           Read: Disabled
          Write: Disabled

Device Statistics (GP Log 0x04)
Page  Offset Size        Value Flags Description
0x01  =====  =               =  ===  == General Statistics (rev 1) ==
0x01  0x008  4              13  ---  Lifetime Power-On Resets
0x01  0x010  4             145  ---  Power-on Hours
0x01  0x018  6      1200047924  ---  Logical Sectors Written
0x01  0x020  6         2860535  ---  Number of Write Commands
0x01  0x028  6      1608553599  ---  Logical Sectors Read
0x01  0x030  6         2008039  ---  Number of Read Commands
0x03  =====  =               =  ===  == Rotating Media Statistics (rev 1) ==
0x03  0x008  4             145  ---  Spindle Motor Power-on Hours
0x03  0x010  4             145  ---  Head Flying Hours
0x03  0x018  4              13  ---  Head Load Events
0x03  0x020  4               0  ---  Number of Reallocated Logical Sectors
0x03  0x028  4               2  ---  Read Recovery Attempts
0x03  0x030  4               9  ---  Number of Mechanical Start Failures
0x04  =====  =               =  ===  == General Errors Statistics (rev 1) ==
0x04  0x008  4               0  ---  Number of Reported Uncorrectable Errors
0x04  0x010  4               0  ---  Resets Between Cmd Acceptance and Completion
0x05  =====  =               =  ===  == Temperature Statistics (rev 1) ==
0x05  0x008  1              30  ---  Current Temperature
0x05  0x010  1              29  N--  Average Short Term Temperature
0x05  0x018  1               -  N--  Average Long Term Temperature
0x05  0x020  1              33  ---  Highest Temperature
0x05  0x028  1              19  ---  Lowest Temperature
0x05  0x030  1              31  N--  Highest Average Short Term Temperature
0x05  0x038  1              24  N--  Lowest Average Short Term Temperature
0x05  0x040  1               -  N--  Highest Average Long Term Temperature
0x05  0x048  1               -  N--  Lowest Average Long Term Temperature
0x05  0x050  4               0  ---  Time in Over-Temperature
0x05  0x058  1              60  ---  Specified Maximum Operating Temperature
0x05  0x060  4               0  ---  Time in Under-Temperature
0x05  0x068  1               0  ---  Specified Minimum Operating Temperature
0x06  =====  =               =  ===  == Transport Statistics (rev 1) ==
0x06  0x008  4             125  ---  Number of Hardware Resets
0x06  0x010  4             112  ---  Number of ASR Events
0x06  0x018  4               0  ---  Number of Interface CRC Errors
                                |||_ C monitored condition met
                                ||__ D supports DSN
                                |___ N normalized value

SATA Phy Event Counters (GP Log 0x11)
ID      Size     Value  Description
0x0001  2            0  Command failed due to ICRC error
0x0002  2            0  R_ERR response for data FIS
0x0003  2            0  R_ERR response for device-to-host data FIS
0x0004  2            0  R_ERR response for host-to-device data FIS
0x0005  2            0  R_ERR response for non-data FIS
0x0006  2            0  R_ERR response for device-to-host non-data FIS
0x0007  2            0  R_ERR response for host-to-device non-data FIS
0x0009  2           20  Transition from drive PhyRdy to drive PhyNRdy
0x000a  2           19  Device-to-host register FISes sent due to a COMRESET
0x000b  2            0  CRC errors within host-to-device FIS
0x000d  2            0  Non-CRC errors within host-to-device FIS

# hdparm -tT /dev/sda
/dev/sda:
 Timing cached reads:   30620 MB in  1.99 seconds = 15374.86 MB/sec
 Timing buffered disk reads: 562 MB in  3.00 seconds = 187.20 MB/sec

$ dd if=/dev/zero of=archivo.img count=1K bs=1M conv=fdatasync
1024+0 records in
1024+0 records out
1073741824 bytes (1,1 GB, 1,0 GiB) copied, 6,37302 s, 168 MB/s

Las pruebas de lectura con hdparm y con dd. Cuanto más velocidad indiquen, mejor, por supuesto.

palimpsest – Prueba de rendimiento de solo lectura (clic para agrandar)

Este gráfico representa la velocidad de lectura y el tiempo de acceso en distintas partes del disco, desde los sectores más externos al plato (parte izquierda) hasta los más cercanos al eje (parte derecha). La línea azul representa la velocidad de lectura (asociada a la escala izquierda), mientras que los puntos verdes representan los tiempos de acceso en distintas ubicaciones del disco (asociada a la escala derecha).

Como en todos los almacenamientos rotativos, existe una gran diferencia en la velocidad de lectura al operar con los primeros sectores respecto de los últimos: de casi 200 MB/s en los primeros sectores, a 100 MB/s en los últimos. La latencia de acceso ronda los 18 ms, variando entre 10 ms y 30 ms aprox.

$ bonnie++

(pendiente de realizar)

Todas las pruebas fueron realizadas sobre una partición ext4.

lunes, febrero 05, 2018

Kernel with KPTI and full Retpoline for Debian Stretch

Durante enero salieron a la luz –al menos para nosotros, simples mortales– las vulnerabilidades meltdown y spectre, que ya son ampliamente conocidas. Las mitigaciones tardaron en aparecer –y aún están trabajando en ello–, pero teniendo en cuenta que los bugs ya están siendo aprovechados in the wild, conviene tener a mano algunos parches para zafar.

Por ello aquí dejo el último kernel con los parches KPTI y full Retpoline, construido con un compilador compatible con -mindirect-branch, para ser instalado directamente sobre Debian GNU/Linux 9 Stretch:

jueves, noviembre 16, 2017

Kernels nuevos en Debian Stretch

Actualización 2019: Este post ha quedado obsoleto. En Kernels nuevos en Debian Buster encontrarán núcleos compilados para la nueva versión estable de Debian.

Continuando con la serie de posts con versiones estables del kernel de Linux, dejo disponible la última versión que compilé en casa. Todas estas son directamente instalables sobre Debian GNU/Linux 9.0 Stretch de 64 bits sin quilombo de dependencias. Cada directorio contiene los paquetes con la imagen del kernel, los encabezados y la configuración utilizada en la compilación.
Si les interesa saber qué hay de nuevo, les dejo el link al post sobre novedades del kernel en Phoronix y el clásico resumen hecho por la gente de KernelNewbies.

sábado, julio 08, 2017

Skype for linux y los tonos DTMF

Increíble. Una aplicación de telefonía donde en la última versión (5.3.01, al menos) no anda el keypad para enviar tonos DTMF.

Obviamente, sin eso no podés hablar con el 90% de las empresas que tienen un preatendedor (“para ventas, marque 1; para soporte, marque 2, …”), que es para lo que fundamentalmente lo utilizo.

Si eso anduvo siempre… ¿qué necesidad había de cambiar el código?

Sabemos que Skype viene cayendo desde hace rato, pero caer… tan bajo?