More HSP/HFP bluetooth headset woes (WH-XB700) [SOLVED]

Well, I think you have seen the previous posts (below) where I rambled about connection problems with bluetooth headphones/headsets on Debian.

If you’ve already read it, be aware that they don’t reflect the current situation. I’ll elaborate…

After moving back to Debian Bullseye a few months ago, I was given (a delightful gift from a lovely person, I must say) a pair of Sony WH-XB700 headphones which are now working great on that platform, BUT be aware that you may run into some problems while setting them up.

This is my current configuration:

$ inxi -F
System: Host: hp-laptop Kernel: 5.10.0-11-amd64 x86_64 bits: 64 Desktop: Cinnamon 4.8.6
Distro: Debian GNU/Linux 11 (bullseye)
Audio: Device-1: Intel Sunrise Point-LP HD Audio driver: snd_hda_intel
Sound Server: ALSA v: k5.10.0-11-amd64
Bluetooth: Device-1: Intel Bluetooth wireless interface type: USB driver: btusb
Report: ID: hci0 state: up running bt-v: 2.1 address: [REDACTED]

$ apt list --installed bluez blueman pulseaudio pulseaudio-module-bluetooth
blueman/stable,now 2.1.4-1+b1 amd64 [installed]
bluez/stable,now 5.55-3.1 amd64 [installed,automatic]
pulseaudio-module-bluetooth/stable,now 14.2-2 amd64 [installed,automatic]
pulseaudio/stable,now 14.2-2 amd64 [installed]

After connecting the headphones, sound is great with the a2dp_sink [High Fidelity Playback (A2DP Sink)] profile. HOWEVER, while trying to switch to headset_head_unit [Headset Head Unit (HSP/HFP)] profile to use the built-in microphone for calls and meets, pulseaudio kept hanging, crashing and restarting with the following errors (hidden on pulseaudio’s journal):

$ journalctl --user -u pulseaudio   # run this as normal user
Mar 05 12:28:14 hp-laptop pulseaudio[1290]: q overrun, queuing locally
Mar 05 12:28:15 hp-laptop pulseaudio[1290]: q overrun, queuing locally
Mar 05 12:28:15 hp-laptop pulseaudio[1290]: q overrun, queuing locally

Also, bluetooth logs showed problems while trying to set up the audio AVCTP / AVRCP protocols:

# journalctl -u bluetooth   # run this as root user
Mar 05 12:28:42 hp-laptop bluetoothd[840]: Starting SDP server
Mar 05 12:28:42 hp-laptop bluetoothd[840]: Bluetooth management interface 1.18 initialized
Mar 05 12:28:42 hp-laptop bluetoothd[840]: profiles/audio/avctp.c:avctp_server_socket() setsockopt(L2CAP_OPTIONS): Invalid argument (22)
Mar 05 12:28:42 hp-laptop bluetoothd[840]: avrcp-controller: Protocol not supported (93)
Mar 05 12:28:42 hp-laptop bluetoothd[840]: profiles/audio/avctp.c:avctp_server_socket() setsockopt(L2CAP_OPTIONS): Invalid argument (22)
Mar 05 12:28:42 hp-laptop bluetoothd[840]: audio-avrcp-target: Protocol not supported (93)
Mar 05 12:28:42 hp-laptop bluetoothd[840]: profiles/sap/server.c:sap_server_register() Sap driver initialization failed.
Mar 05 12:28:42 hp-laptop bluetoothd[840]: sap-server: Operation not permitted (1)
Mar 05 12:28:45 hp-laptop bluetoothd[840]: Endpoint registered: sender=:1.50 path=/MediaEndpoint/A2DPSink/sbc
Mar 05 12:28:45 hp-laptop bluetoothd[840]: Endpoint registered: sender=:1.50 path=/MediaEndpoint/A2DPSource/sbc
Mar 05 12:29:03 hp-laptop bluetoothd[840]: Endpoint unregistered: sender=:1.50 path=/MediaEndpoint/A2DPSink/sbc
Mar 05 12:29:03 hp-laptop bluetoothd[840]: Endpoint unregistered: sender=:1.50 path=/MediaEndpoint/A2DPSource/sbc
Mar 05 12:29:03 hp-laptop bluetoothd[840]: Endpoint registered: sender=:1.83 path=/MediaEndpoint/A2DPSink/sbc
Mar 05 12:29:03 hp-laptop bluetoothd[840]: Endpoint registered: sender=:1.83 path=/MediaEndpoint/A2DPSource/sbc

Well, after a lot of headaches and dead ends, it turned out that some process (I haven’t figured out which one, yet) was stealthily switching off the ERTM (Enhanced ReTransmission Mode) and ESCO (Enhanced SCO) protocols of my Bluetooth stack.

So if you have a similar problem, verify that your stack does not have them disabled by looking at /sys/module/bluetooth/parameters/

# grep --color . /sys/module/bluetooth/parameters/disable_e*

If you see a Y there, you might want to try re-enabling ERTM and ESCO by issuing the following commands:

echo N > /sys/module/bluetooth/parameters/disable_ertm
echo N > /sys/module/bluetooth/parameters/disable_esco
systemctl restart bluetooth

After doing that, switching to headset_head_unit profile should work fine and the headset can be used without any problem.

I’ll try to test the same setup with the new pipewire stack in the following days, but in the meantime, kudos to Juan Pablo Lassala for describing the proper solution to this tricky problem on pulseaudio issue tracker.


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 (93898, 9731673325) and in the new (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 (93898, 9731673325) y en el nuevo (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.


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 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.

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

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
	Used: unknown (minor revision code 0x0029) 
	Supported: 8 7 6 5 
	Likely used: 8
	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
	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
	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
	    	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
	   *	SMART error logging
	   *	SMART self-test
	    	Media Card Pass-Through
	   *	General Purpose Logging feature set
	   *	64-bit World wide name
	   *	{READ,WRITE}_DMA_EXT_GPL commands
	    	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)
	Master password revision code = 65534
	not	enabled
	not	locked
	not	expired: security count
	not	supported: enhanced erase
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,

Model Family:     Toshiba 3.5" DT01ACA... Desktop HDD
Device Model:     TOSHIBA DT01ACA100
Serial Number:    [REDACTED]
Firmware Version: MS2OA750
User Capacity: 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

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
					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:
  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
    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

 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.

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:

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.

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?

Post instalación Debian GNU/Linux 9 (Stretch)

Más o menos cada dos años (aunque debería decir “when ready“) sale una nueva versión de la rama estable de Debian, y así fue el caso en junio del corriente, pues liberaron Debian 9 “Stretch”.
Para continuar la secuencia de recomendaciones post-instalación que inició con un post de Tomás, es buen momento de llevar mi humilde sugerencia de paquetes para obtener un escritorio usable en esta última versión.

Haciendo un copy-paste del post previo, éste tiene dos destinatarios principales:

  • para el que quiera tener una instalación de debian stretch (estable) usable, vale decir, con algunas aplicaciones más modernas que las que trae por defecto pero tratando de no salir demasiado de los repos oficiales;
  • y para mí, para no perder tiempo haciendo memoria en el caso de tener que reinstalar el sistema.

Y en la constante búsqueda de comodidad digital, cambio nuevamente de entorno de escritorio. Ahora el elegido es Cinnamon (las veces anteriores fueron GNOME y KDE) por tres cuestiones principales:

  • en primer lugar -y fundamentalmente- porque el explorador de archivos Nemo tiene árbol de directorios. Nautilus no lo tiene y eso lo hace inutilizable;
  • en segundo lugar, porque el entorno es estéticamente agradable y razonablemente liviano;
  • y finalmente, porque a diferencia de Mate, está hecho con GTK3 e integra adecuadamente la mayoría de las aplicaciones de escritorio.

Podría haber seguido utilizando KDE, la verdad es que está muy bien armado también, pero me di cuenta que sigo utilizando aplicaciones gtk (gedit, evince, meld) y pareció razonable el cambio.

Bueno, sin mas charla, vamos a lo que nos trae.

Paso 1

Esta instalación ocupará al menos 6 GB, por lo que tengan en cuenta cuanto desean dejar libre para los directorios de usuario y para el crecimiento/mantenimiento del sistema. Para comenzar, partimos de la instalación base de Debian Stretch. Para que se den una idea, hay que seguir la instalación tradicional y cuando presenta el uso que se dará (escritorio, servidor, etc) desmarcar todas las opciones y continuar normalmente.

Paso 2

Una vez instalado y hecho el primer arranque, luego de iniciar sesión lo que suelo hacer al toque es deshabilitar la opción de instalación de paquetes recomendados, puesto que pocas veces son necesarios y además engordan sobremanera el espacio ocupado por el sistema. Para ello basta con ejecutar la línea siguiente para que las próximas instalaciones eviten instalarlos.

echo "APT::Install-Recommends \"false\";" > \

Paso 3

Luego, sólo si están detrás de un proxy, hay varias formas de configurarlo: puede ser globalmente mediante las variables de entorno http_proxy y https_proxy o bien mediante la configuración de APT para aquellos casos donde dispongan de un servidor de caché como APT-Cacher. Por ejemplo:

export http_proxy=$PROXY
export https_proxy=$PROXY
echo "Acquire::http::Proxy \"$PROXY\";" > /etc/apt/apt.conf.d/90-powerup-proxy.conf

Paso 4

Verificar que están configurados los repositorios oficiales de la distribución. Para ello, el archivo /etc/apt/sources.list debería listar, al menos, los siguientes:

deb stretch main contrib non-free
deb stretch/updates main contrib non-free
deb stretch-updates main contrib non-free
deb stretch-backports main contrib non-free

Aquí utilizo el mirror que cordialmente provee la UNNOBA pues gracias a la Asociación Redes de Interconexión Universitaria estamos a pocos saltos de distancia. Traten de no atosigarla de peticiones o utilicen cualquier otro de los mirrors listados oficialmente.

Paso 5

Agregar repositorios externos (no oficiales) que contienen software útil. Este paso es un tanto complejo pues a partir de Stretch es necesario incorporar las claves públicas para poder descargar software adicional. Además, algunas aplicaciones sólo están disponibles para arquitectura de 64 bits. Desde luego, tengan en cuenta que adicionar un repositorio no oficial implica confiar en lo que sus administradores publiquen allí.

Paso 5.1. Paquetes requeridos para las operaciones posteriores

apt install apt-transport-https ca-certificates gnupg wget

Paso 5.2. Instalar las claves públicas de los repositorios

El nombre final indica qué aplicación contiene cada repositorio. Las claves deben alojarse en el directorio siguiente:

cd /etc/apt/trusted.gpg.d/
wget -q -O- | gpg --dearmor > google-chrome.gpg
wget -q -O- | gpg --dearmor > vscode.gpg
wget -q "" -O- | gpg --dearmor > dropbox.gpg
wget -q "" -O- | gpg --dearmor > spotify.gpg
wget -q -O- | gpg --dearmor > virtualbox.gpg

Paso 5.3. Definir los repositorios externos

Van todos en el directorio siguiente:

cd /etc/apt/sources.list.d/
# software solo disponible para amd64
echo "deb [arch=amd64] stable main" > google-chrome.list
echo "deb [arch=amd64] stable main" > vscode.list
# software disponible para i386 y amd64
echo "deb [arch=i386,amd64] sid main" > dropbox.list
echo "deb stable non-free" > spotify.list
echo "deb stretch contrib" > virtualbox.list

Paso 6

Clásico: actualizar la lista de paquetes. Utilizaremos apt en vez de apt-get sólo por cuestión de gusto. Ustedes utilicen el que prefieran.

apt update

Paso 7

Instalar un entorno gráfico. Para la interfaz gráfica hay varios metapaquetes que se corresponden a cada entorno de escritorio: para Cinnamon instalaremos task-cinnamon-desktop; para KDE, instalen kde-plasma-desktop; para GNOME supongo que gnome-core alcanza (no lo sé con certeza); para XFCE instalen xfce4; para LXQT (lo que antes era LXDE) instalen lxqt; y para Mate el paquete mate-desktop-environment . Si alguno quedó afuera me avisan.

Tengo entendido que para placas GPU AMD/ATI ya no es necesario ningún driver privativo, pues el driver open-source Radeon alcanza, pero eventualmente podría ser necesario para placas GPU nVidia, donde el paquete a instalar es xserver-xorg-video-nvidia o alguno de los drivers que aparecen con el nombre nvidia-legacy. Si tienen un chipset Intel, con lo que viene por defecto suele alcanzar.

Sobre el entorno gráfico, como comentaba al inicio del artículo, mi recomendación esta vez es utilizar Cinnamon, pero instalo Openbox también pues suele ser útil para casos de urgencia. Los demás componentes de nombre extraño son bibliotecas que evitan que Cinnamon arroje advertencias o aplicaciones que se prefieren antes de las que vendrían por defecto.

apt install xorg lightdm mesa-utils openbox xserver-xorg-input-all \

apt install task-cinnamon-desktop cinnamon-l10n desktop-base \
    gir1.2-gtop-2.0 gir1.2-nmgtk-1.0 network-manager-gnome \
    pulseaudio firefox-esr firefox-esr-l10n-es-ar thunderbird \

Superpaso 8

Instalar paquetes desde los repositorios oficiales. Como en la línea anterior, cada paquete está enlazado a su descripción en el sitio de Debian.

Paso 8.1. Controladores y servicios útiles

apt install acpi-support amd64-microcode cifs-utils dkms fail2ban \
    intel-microcode ntfs-3g ssh unattended-upgrades uptimed

Paso 8.2. Herramientas útiles de línea de comando

apt install acpi alsa-utils aptitude buku bash-completion clamav \
    curl deborphan dialog ffmpeg file fish flac hexedit htop \
    iotop imagemagick iptraf-ng irqbalance jmtpfs less lftp \
    livestreamer manpages markdown mc mlocate nano \
    netcat-openbsd nethogs nmap p7zip-full pv pxz qemu-kvm \
    screen smbclient sshfs tcpdump trickle tshark unrar unzip \
    vbindiff w3m wavemon wget youtube-dl zip

Paso 8.3. Lenguajes de programación, herramientas y documentación

apt install build-essential git git-doc git-man idle3 ipython3 \
    pylint3 python3 python3-doc sqlite3 sqlite3-doc

Paso 8.4. Programas gráficos para fines variados (editores, reproductores, etc)

apt install default-jre filezilla fslint gufw hardinfo keepassx \
    mpv pavucontrol sound-theme-freedesktop sqlitebrowser \
    synaptic vlc wireshark-gtk xdg-user-dirs-gtk xterm

apt install baobab blueman brasero cheese gnome-font-viewer \
    gnome-system-monitor gnote gvfs-backends gvfs-fuse \
    nemo-fileroller rhythmbox transmission-gtk audacious \
    file-roller gedit-plugins ghex gimp gksu gucharmap leafpad \
    meld sound-juicer 

Paso 8.5. Soporte y drivers para impresoras

apt install cups cups-browsed foomatic-db-compressed-ppds \
    foomatic-db-engine openprinting-ppds printer-driver-cups-pdf \
    system-config-printer system-config-printer-udev

Paso 8.6. Iconos y temas de escritorio

apt install arc-theme breeze-icon-theme clearlooks-phenix-theme \
    faba-icon-theme gnome-colors lxde-icon-theme mate-icon-theme \
    mate-icon-theme-faenza tango-icon-theme

Paso 8.7. Versión más moderna del kernel (4.17) y encabezados

Reemplacen amd64 por i386 si su arquitectura es de 32 bits. La primera línea instala la versión de kernel de Estable. La segunda línea (que dice stretch-backports) instala adicionalmente una versión más moderna.

apt install firmware-linux linux-headers-amd64 linux-image-amd64 \
apt -t stretch-backports install firmware-linux \
    linux-headers-amd64 linux-image-amd64 linux-doc

Paso 8.8. Versión más moderna de la suite LibreOffice (6.1)

apt -t stretch-backports install libreoffice \
    libreoffice-help-es libreoffice-l10n-es \
    libreoffice-gtk3 hunspell-es \
    libreoffice-style-breeze libreoffice-style-sifr \
    libreoffice-style-tango libreoffice-gnome \
    libreoffice-style-colibre \

Paso 8.9. Firefox más moderno

Omitido pues la que viene por defecto (ERS 52) es una versión bastante moderna.

Paso 8.10. Tipografías

apt install fonts-cantarell fonts-croscore fonts-crosextra-caladea \
    fonts-crosextra-carlito fonts-dejavu fonts-dkg-handwriting \
    fonts-awesome fonts-humor-sans fonts-liberation fonts-noto \
    fonts-oxygen fonts-roboto

Paso 9

Instalar paquetes desde repositorios externos.

apt install dropbox spotify-client virtualbox-5.2

Las aplicaciones siguientes sólo están disponibles en versión de 64 bits, por lo que si su arquitectura es 32… lo siento…

apt install code google-chrome-stable

Con eso queda listo prácticamente todo lo que proviene por fuera de Debian. Lo único queda pendiente es PyCharm, que como no tiene paquete disponible hay que bajarse el comprimido y alojarlo donde crean conveniente.

Paso 10

Listo, con eso les queda un sistema operativo, a mi juicio, casi perfecto.

El tema de escritorio de las capturas es Arc Darker, el conjunto de iconos es Gnome Wine y fuentes son Noto Sans UI Regular en su mayoría.

Todo lo documentado aquí está disponible en un sencillo script que instala Cinnamon y ejecuta todos estos pasos de un saque. Lo dejo disponible por si les sirve: (20180802)

Algunos consejos adicionales:

  • Para iniciar un programa rápidamente, usen la tecla Win y escriban parte del nombre. Alt+F2 también funciona, pero no tiene autocompletado.
  • La fuente Noto tiene un montón de variantes para distintos idiomas y por ello los cuadros de dialogo de selección de fuente se hacen eternos. Como usualmente uno sólo utiliza los alfabetos latinos, es posible desactivar aquellas fuentes que no se utilizan y reducir el listado. Para ello, descarguen este archivo 95-powerup-restrict-noto.conf y guardenlo en el directorio /etc/fonts/conf.d/
  • Para tener la tipografía clásica en las terminales Fx, ejecuten dpkg-reconfigure console-setup y en “Tipo de letra para la consola” seleccionen “No cambie la tipografía del arranque”.

Falta un paso adicional (súmamente útil) para mejorar toda la tipografía del sistema, pero eso queda para el post del mes que viene. Mientras tanto, si me olvido de algo, o ven algo que sobra, abajo están los comentarios…

Copyright © All Rights Reserved · Green Hope Theme by Sivan & schiy · Proudly powered by WordPress