Por que o dmesg toca a campainha do terminal em "unsuspend"?

1

Sempre que eu suspenso meu laptop, a janela tmux que eu tenho aberto (correndo dmesg -w ) acende:

Na página do manual do tmux, isso significa que o aplicativo em execução na janela tocou a campainha do terminal.

Eu tenho outra máquina com essencialmente a mesma configuração (mesmo sistema operacional, mesma configuração do tmux), e isso não acontece lá - apenas neste laptop específico. Por que o dmesg está tocando a campainha do terminal na suspensão desta máquina?

Versões de software:

$ uname -a
Linux localhost 3.10.18 #1 SMP Mon Jan 8 23:08:08 PST 2018 armv7l armv7l armv7l GNU/Linux
$ lsb_release -cr
Release:        16.04
Codename:       xenial
$ tmux -V
tmux 2.6
$ dmesg --version
dmesg from util-linux 2.27.1
    
por Josh 22.01.2018 / 15:26

1 resposta

3

Se você examinar a saída do dmesg, poderá ver exatamente quando está tocando a campainha, usando o caractere BEL ASCII \a :

$ dmesg | grep -C1 $'\a'
[    5.706427] usb 1-2: Manufacturer: HD WebCam
[    5.706434] usb 1-2: SerialNumber: NC2141103Q533020AALM03
[    5.798439] Unsafe core_pattern used with suid_dumpable=2. Pipe handler or fully qualified core dump path required.
--
[13843.531106] usb 1-2: Manufacturer: HD WebCam
[13843.531115] usb 1-2: SerialNumber: NC2141103Q533020AALM03
[13843.546586] uvcvideo: Found UVC 1.00 device HD WebCam (0bda:57cf)

Curiosamente, o toque do sino parece estar acontecendo na metade da inicialização da webcam. Podemos verificar exatamente onde na linha a BEL está sendo impressa, passando por od:

$ dmesg | grep $'\a' | head -n 1 | od -c
0000000   [                   5   .   7   0   6   4   3   4   ]       u
0000020   s   b       1   -   2   :       S   e   r   i   a   l   N   u
0000040   m   b   e   r   :      \a   N   C   2   1   4   1   1   0   3
0000060   Q   5   3   3   0   2   0   A   A   L   M   0   3  \n
0000076

O BEL é representado aqui como \a e está sendo impresso logo antes do número de série ( SerialNumber: ␇NC214... ). Parece improvável que o dmesg insira um BEL no meio de uma linha, então talvez seja o kernel que está registrando o arquivo.

Vamos verificar o código-fonte. Talvez o driver USB esteja imprimindo uma campainha quando registra o número de série. Podemos usar livegrep rapidamente pesquise a origem do Linux 4.12 e descubra que o arquivo relevante provavelmente é drivers/usb/core/hub.c . Então, podemos voltar para a fonte do Linux 3.10.18 usando Elixir , e encontre a função relevante:

static void announce_device(struct usb_device *udev)
{
    dev_info(&udev->dev, "New USB device found, idVendor=%04x, idProduct=%04x\n",
        le16_to_cpu(udev->descriptor.idVendor),
        le16_to_cpu(udev->descriptor.idProduct));
    dev_info(&udev->dev,
        "New USB device strings: Mfr=%d, Product=%d, SerialNumber=%d\n",
        udev->descriptor.iManufacturer,
        udev->descriptor.iProduct,
        udev->descriptor.iSerialNumber);
    show_string(udev, "Product", udev->product);
    show_string(udev, "Manufacturer", udev->manufacturer);
    show_string(udev, "SerialNumber", udev->serial);
}

show_string é uma função muito simples, definida acima de announce_device , que praticamente imprime seus argumentos separados por dois pontos e um espaço:

static void show_string(struct usb_device *udev, char *id, char *string)
{
    if (!string)
        return;
    dev_info(&udev->dev, "%s: %s\n", id, string);
}

Então não é o kernel que está adicionando o sino.

Qual é o número de série do dispositivo USB?

Podemos verificar com o lsusb:

$ lsusb -vd 0bda:57cf | grep iSerial
  iSerial                 2 NC2141103Q533020AALM03

OK, agora vamos direcioná-lo por od:

$ lsusb -vd 0bda:57cf | grep iSerial | od -c
0000000           i   S   e   r   i   a   l
0000020                                           2      \a   N   C   2
0000040   1   4   1   1   0   3   Q   5   3   3   0   2   0   A   A   L
0000060   M   0   3  \n
0000064

que sugere que, de fato, o número de série da webcam contém uma ASCII BEL.

    
por 22.01.2018 / 15:26

Tags