Инструменты пользователя

Инструменты сайта



// Почему разработчики драйверов для Linux могут ненавидеть дистрибутивы подобные CentOS?

Короткое исследование недавней проблемы.

Пока на моём корявом английском: Why may Linux driver developers hate distros like CentOS? (или кликаем кнопочку перевода)

// Делим длинную строку в консоли

Открыл для себя утилиту fold:

$ echo "Я помню чудное мгновенье, передо мной явилась ты, как мимолётное видение, как гений чистой красоты" | fold -s -w80
Я помню чудное мгновенье, передо мной 
явилась ты, как мимолётное видение, как 
гений чистой красоты

-s - делить по пробельным символам, -wXXX - ширина вывода. За подробностями в man 1 fold.

// errno(1)

No comments…

$ sudo pacman -S moreutils
 
$ errno -l
errno -l
EPERM 1 Операция не позволена
ENOENT 2 Нет такого файла или каталога
ESRCH 3 Нет такого процесса
EINTR 4 Прерван системный вызов
 
$ errno EAGAIN
EAGAIN 11 Ресурс временно недоступен
 
$ errno 39
ENOTEMPTY 39 Каталог не пуст

По желанию добавляется env LANG=C.

На Ubuntu:

sudo apt install moreutils

// ThinkPad T530: делаем из кнопки Launch1 - SysRq

Он же Print Screen. От которого в неудобном месте мы уже избавились: Thinkpad T530: клавиатура

// Totalphase Data Center на Manjaro

С недавнего времени сия софтина перестала запускаться с сетованием на следующуют проблему:

 error: unable to execute application

Что-то подсказывает, что дело в библиотеках: основные (как и само ядро в виде libruntime.so) лежат в каталоге /lib/ дистрибутива. Но что-то, судя по всему, пытается браться из системы и там оно перестало существовать, что не удивительно для быстроменяющихся дистрибутивов типа Arch, Manjaro или Solus.

// Падение Xorg после выхода из suspend

Замечено на ядрах 4.15. Проявляется не всегда.

В логах замечено следующее, накануне сего события:

Apr 13 21:56:33 localhost kernel: Restarting tasks ... done.
Apr 13 21:56:33 localhost kernel: EXT4-fs error (device sda6): __ext4_get_inode_loc:4619: inode #271265: block 1049210: comm nmbd: unable to read itable block
Apr 13 21:56:33 localhost kernel: Buffer I/O error on dev sda6, logical block 0, lost sync page write
Apr 13 21:56:33 localhost kernel: EXT4-fs error (device sda6) in ext4_reserve_inode_write:5754: IO failure
Apr 13 21:56:33 localhost kernel: EXT4-fs (sda6): previous I/O error to superblock detected
Apr 13 21:56:33 localhost kernel: Buffer I/O error on dev sda6, logical block 0, lost sync page write
Apr 13 21:56:33 localhost kernel: EXT4-fs error (device sda6): __ext4_get_inode_loc:4619: inode #271265: block 1049210: comm nmbd: unable to read itable block
Apr 13 21:56:33 localhost kernel: EXT4-fs (sda6): previous I/O error to superblock detected
Apr 13 21:56:33 localhost kernel: Buffer I/O error on dev sda6, logical block 0, lost sync page write
Apr 13 21:56:33 localhost kernel: EXT4-fs error (device sda6) in ext4_reserve_inode_write:5754: IO failure
Apr 13 21:56:33 localhost kernel: EXT4-fs (sda6): previous I/O error to superblock detected
Apr 13 21:56:33 localhost kernel: Buffer I/O error on dev sda6, logical block 0, lost sync page write
Apr 13 21:56:33 localhost kernel: EXT4-fs error (device sda6) in ext4_orphan_add:2819: IO failure
Apr 13 21:56:33 localhost kernel: EXT4-fs (sda6): previous I/O error to superblock detected
Apr 13 21:56:33 localhost kernel: Buffer I/O error on dev sda6, logical block 0, lost sync page write
Apr 13 21:56:33 localhost kernel: EXT4-fs error (device sda6): __ext4_get_inode_loc:4619: inode #271265: block 1049210: comm nmbd: unable to read itable block
Apr 13 21:56:33 localhost kernel: EXT4-fs (sda6): previous I/O error to superblock detected
Apr 13 21:56:33 localhost kernel: Buffer I/O error on dev sda6, logical block 0, lost sync page write
Apr 13 21:56:33 localhost kernel: EXT4-fs error (device sda6) in ext4_reserve_inode_write:5754: IO failure
Apr 13 21:56:33 localhost kernel: EXT4-fs (sda6): previous I/O error to superblock detected
Apr 13 21:56:33 localhost kernel: Buffer I/O error on dev sda6, logical block 0, lost sync page write
Apr 13 21:56:33 localhost kernel: PM: suspend exit
...
Apr 13 21:56:35 localhost kernel: WARNING: CPU: 2 PID: 688 at fs/buffer.c:1108 mark_buffer_dirty+0xe9/0x100
Apr 13 21:56:35 localhost kernel: Modules linked in: veth hid_generic uhid hid algif_hash algif_skcipher af_alg cmac rfcomm ccm ipt_MASQUERADE nf_nat_masquerade_ipv4 nf_conntrack_netlink nfnetlink xfrm_user xfrm_algo iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 xt_addrtype iptable_filter xt_conntrack nf_nat nf_conntrack libcrc32c crc32c_generic br_netfilter bridge stp llc overlay bnep btusb btrtl intel_rapl btbcm btintel x86_pkg_temp_thermal intel_powerclamp bluetooth ecdh_generic kvm_intel uvcvideo videobuf2_vmalloc videobuf2_memops videobuf2_v4l2 videobuf2_core videodev kvm media tun irqbypass snd_hda_codec_realtek crct10dif_pclmul crc32_pclmul ghash_clmulni_intel snd_hda_codec_generic coretemp pcbc aesni_intel aes_x86_64 crypto_simd joydev glue_helper mousedev cryptd msr iTCO_wdt mei_wdt intel_cstate intel_uncore
Apr 13 21:56:35 localhost kernel:  arc4 iwldvm tpm_tis tpm_tis_core mac80211 tpm intel_rapl_perf iwlwifi iTCO_vendor_support wmi_bmof snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_pcm e1000e cfg80211 mei_me psmouse i2c_i801 thinkpad_acpi shpchp snd_timer ptp mei lpc_ich pps_core nvram rfkill fuse battery input_leds snd ac rtc_cmos wmi soundcore evdev mac_hid vboxpci(O) vboxnetflt(O) vboxnetadp(O) vboxdrv(O) acpi_call(O) parport_pc ppdev lp parport sg crypto_user ip_tables x_tables ext4 crc16 mbcache jbd2 fscrypto sr_mod cdrom sd_mod serio_raw atkbd libps2 ahci sdhci_pci xhci_pci libahci ehci_pci sdhci xhci_hcd ehci_hcd libata crc32c_intel led_class scsi_mod mmc_core usbcore usb_common i8042 serio i915 i2c_algo_bit drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops drm intel_agp intel_gtt agpgart
Apr 13 21:56:35 localhost kernel: CPU: 2 PID: 688 Comm: jbd2/sda6-8 Tainted: G           O     4.15.14-1-MANJARO #1
Apr 13 21:56:35 localhost kernel: Hardware name: LENOVO 2392AQU/2392AQU, BIOS G4ETB0WW (2.70 ) 09/26/2017
Apr 13 21:56:35 localhost kernel: RIP: 0010:mark_buffer_dirty+0xe9/0x100
Apr 13 21:56:35 localhost kernel: RSP: 0018:ffffb4a18215bcd8 EFLAGS: 00010246
Apr 13 21:56:35 localhost kernel: RAX: 0000000000a20828 RBX: ffffa300bfd02750 RCX: ffffa2fea42ed8e8
Apr 13 21:56:35 localhost kernel: RDX: ffffa300bfd02750 RSI: ffffa2fea42edf00 RDI: ffffa300bfd02750
Apr 13 21:56:35 localhost kernel: RBP: ffffa300bfd02750 R08: 0000000000000000 R09: ffffa300ad083fc0
Apr 13 21:56:35 localhost kernel: R10: 0000000000000000 R11: 0000000000000228 R12: ffffa300bcdfd388
Apr 13 21:56:35 localhost kernel: R13: ffffa2fea42ed780 R14: ffffa300a9361e00 R15: ffffa300bfd02752
Apr 13 21:56:35 localhost kernel: FS:  0000000000000000(0000) GS:ffffa300de280000(0000) knlGS:0000000000000000
Apr 13 21:56:35 localhost kernel: CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
Apr 13 21:56:35 localhost kernel: CR2: 00007f4688041160 CR3: 00000002de00a005 CR4: 00000000001606e0
Apr 13 21:56:35 localhost kernel: Call Trace:
Apr 13 21:56:35 localhost kernel:  __jbd2_journal_refile_buffer+0xa3/0xc0 [jbd2]
Apr 13 21:56:35 localhost kernel:  jbd2_journal_commit_transaction+0x128e/0x18b0 [jbd2]
Apr 13 21:56:35 localhost kernel:  ? sched_clock_cpu+0xe/0xd0
Apr 13 21:56:35 localhost kernel:  ? kjournald2+0xc0/0x270 [jbd2]
Apr 13 21:56:35 localhost kernel:  kjournald2+0xc0/0x270 [jbd2]
Apr 13 21:56:35 localhost kernel:  ? wait_woken+0x80/0x80
Apr 13 21:56:35 localhost kernel:  ? commit_timeout+0x10/0x10 [jbd2]
Apr 13 21:56:35 localhost kernel:  kthread+0x113/0x130
Apr 13 21:56:35 localhost kernel:  ? kthread_create_on_node+0x70/0x70
Apr 13 21:56:35 localhost kernel:  ret_from_fork+0x35/0x40
Apr 13 21:56:35 localhost kernel: Code: c0 48 89 c5 74 2c 48 89 c6 48 89 df 31 d2 e8 7f fd ff ff 48 89 df e8 07 77 fb ff 48 8b 7d 00 be 04 00 00 00 5b 5d e9 67 7d ff ff <0f> 0b e9 25 ff ff ff 48 89 df eb bb 90 66 2e 0f 1f 84 00 00 00 
Apr 13 21:56:35 localhost kernel: ---[ end trace c1b2e1f90bb5b2b0 ]---

Погуглив по строке __jbd2_journal_refile_buffer+0xa3/0xc0 [jbd2] обнаружил:

Рекомендуемый WA: установить параметр scan для модуля scsi_mod в значение sync.

Чревато: увеличение времени выхода из сна, примерно на секунду. Для меня не критично.

Суть: работа по сканированию будет выполнена из того же потока, где выполняет процедура выхода из сна и не возникнет состояния гонки.

Если модуль вкомпилирован в ядро:

  • в параметры ядра нужно передать из загрузчика: scsi_mod.scan=sync
  • например, через grub (grub2):
    • редактируем /etc/default/grub
    • исправляем строку:
      GRUB_CMDLINE_LINUX_DEFAULT="... scsi_mod.scan=sync ..."
    • сохраняем и выполняем update-grub
    • перезагружаемся

Если модуль отдельно, то

  • создаём файл /etc/modprobe.d/scsi_mod.conf
  • в него помещаем:
    # WA:                                                                                                                                                                                         
    # - https://bugzilla.redhat.com/show_bug.cgi?id=1562982
    # - https://bugzilla.redhat.com/show_bug.cgi?id=1553979
    options scsi_mod scan=sync
  • и сразу на рабочей системе исправляем параметры налету:
    echo sync > /sys/module/scsi_mod/parameters/scan
    # или
    echo sync | sudo tee /sys/module/scsi_mod/parameters/scan

Перезагружаться не обязательно.

И ждём исправления в апстриме.

// Linux утилиты для стресс-тестирования системы

Будет пополняться. В контексте изучения проблемы:

CPU

GPU

Наблюдения

К слову сказать, пока никаких реакций на стресс система не даёт. Судя по всему проблемы в интегрированном видео от Intel и не способностью правильно ходить между стейтами энергопотребления (pstates). Т.е. возможно нужно генерировать переменную нагрузку на видеоподсистему, что бы добиться воспроизведения проблемы.

// Pacman: информация по пакетам, установленным как зависимости...

…и не нужные никакому пакету.

На случай, если что-то удалялось как pacman -R пакет вместо pacman -Rs пакет:
<ДЕЛ>

pacman -Qd | awk '{print $1}' | xargs -I{} bash -c 'cnt=$(LANG=C pacman -Qi {} | grep "Required By\|Optional For" | grep None | wc -l); (test $cnt -eq 2 && echo "{}")' | xargs -I{} bash -c '(pacman -Qi {};pacaur -Sii {};echo =================)' 2>&1 | less -R

</ДЕЛ>

Спасибо Романычу, просто список пакетов:

pacman -Qtdq

и с описанием, как в уродстве выше (без запроса к Sync базе или AUR можно просто: pacman -Qtdqi):

pacman -Qtdq | xargs -I{} bash -c '(pacman -Qi {};pacaur -Sii {};echo =================)' 2>&1 | less -R

pacaur используется, что бы запросить информацию для AUR пакетов.

Если какой-то пакет в этом списке уже нужен как самостоятельная единица, то можно снять пометку:

  pacman -S --asexplicit пакет

Теперь вопрос: а как проще?

ЗЫ пакеты, которые не требуются никаким другим пакетом можно получить просто выполнив pacman -Qt

// Идея для BadUSB

Если создать USB-устройство, которое реализует интерфейс пера или тачскрина с абсолютными координатами, задать для осей X и Y значения:

  • min = 0
  • max = 65535

и сделать (эмуляция) хотя бы одно перемещение, то, как минимум, Windows 8, 8.1 и 10 реагируют BSOD и перезагрузкой. Linux работает нормально.

// linux-tools для mainline ядер в Ubuntu

Иногда приходится использовать mainline не из основных репозиториев, а отсюда:

Причин тому может быть несколько. Начиная от желания быть на острие атаки, и заканчивая тем, что на новых ядрах решена проблема характерная для вашего железа или другого окружения. У меня, к примеру, только с 4.10 перестал уходить в тотальный перегрев процессор при использовании Turbo Boost.

Беда этих ядер, что нет полезных пакетов linux-tools, которые требуются таким приложениям как `perf` и `turbostat`. И их нужно собрать самому, причём так, что бы они соответствовали версии ядра. Рассмотрим как это сделать, на примере 4.10.

// Thinkpad T530: клавиатура

Уже были стоны и жалобы от меня по поводу несколько убогой клавиатуры, точнее раскладки, точнее расположению PrtScr кнопки. Но… или жри кактус или исправляй. Я, обычно, выбираю второй вариант.

Если коротко, команда ниже забиндит PrtScr и сделает из неё Menu (aka Compose) клиавишу:

sudo setkeycodes b7 127

Для других клавиатур и ноутбуков может сработать, но нужно уточнять сканкод (b7 в примере выше).

Эту команду помещаем в /etc/rc.local или в аналогичный.

Кому нужно подробностей и альтернативных вариантов - смотрим под катом.

В современных системах почти все устройства ввода обслуживаются evdev. В пару с ними трудится udev. Последний может помочь первому в части переопределения сканкодов клавиш.

Собственно все инструкции описаны в:

less /lib/udev/hwdb.d/60-keyboard.hwdb

Вот выдержки, которых достаточно для настройки:

#  - AT keyboard DMI data matches:
#      evdev:atkbd:dmi:bvn*:bvr*:bd*:svn<vendor>:pn<product>:pvr*
#    <vendor> and <product> are the firmware-provided strings
#    exported by the kernel DMI modalias.

Эта часть описывает шаблон выбора для AT клавиатур. Да, встроенная клавиатура в T530 это AT клавиатура. Привет NKRO из коробки :) Но об этом дальше.

Следующая часть описывает шаги, которые нужно выполнить после настроек.

# To update this file, create a new file
#   /etc/udev/hwdb.d/70-keyboard.hwdb
# and add your rules there. To load the new rules execute (as root):
#   udevadm hwdb --update
#   udevadm trigger /dev/input/eventXX
# where /dev/input/eventXX is the keyboard in question. If in
# doubt, simply use /dev/input/event* to reload all input rules.

Итак, определяем что у нас за клавиатура, смотрим выхлоп dmesg:

...
[    2.282100] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input3
...

С вероятностью 147% оно всегда будет так. Запоминаем (особенно последнюю цифру):

/devices/platform/i8042/serio0/input/input3

Теперь определяем сканкод клавиши (подставляем цифру в конце, которую запомнили выше, т.е. input3event3):

sudo evtest /dev/input/event3

Получаем такой выхлоп:

...
Event: time 1487483975.506795, type 4 (EV_MSC), code 4 (MSC_SCAN), value b7
Event: time 1487483975.506795, type 1 (EV_KEY), code 99 (KEY_SYSRQ), value 0
Event: time 1487483975.506795, -------------- SYN_REPORT ------------

Если выхлоп не получаем, или получаем не тот, который ожидаем: просто перебираем разные номера для event.

Смотрим строку с MSC_SCAN, значение сканкода поле value - b7 искомый сканкод.

Кстати, клавиша определяется как KEY_SYSRQ, но работает только как PrtScr. Для SysRq функциональностью ThinkPad T530: доступ к Break, Pause, Scroll Lock и SysReq.

Далее нам нужно имя клавиши (и код заодно), которые используются внтри ядра. Смотрим в

/usr/include/linux/input-event-codes.h

нужную клавишу. Имя для udev - нижним регистром имя макроопределения, без префикса KEY_. Для setkeycodes - dec значение.

Клавиша меню это:

#define KEY_COMPOSE             127

Имеем:

  1. Имя для udev: compose
  2. Код для setkeycodes: 127

Пишем правило для udev (/etc/udev/hwdb.d/70-thinkpath-t530-keyboard.hwdb):

70-thinkpath-t530-keyboard.hwdb
evdev:atkbd:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
  KEYBOARD_KEY_b7=compose                    # map PrtScr to Menu

Так как у нас только одна AT клавиатура, и другую подключить нельзя, то правило выше вполне имеет право на жизнь, но при желании можно уточнить как-то так:

evdev:atkbd:dmi:bvn*:bvr*:bd*:svnLENOVO*:pn*T530*:pvr*
  KEYBOARD_KEY_b7=compose

Выполняем команды, которые рекомендуют в комментариях к исходному фалу базы:

sudo systemd-hwdb update
sudo udevadm trigger /dev/input/event*

И радуемся жизни. Или используем setkeycodes:

sudo setkeycodes b7 127

тут всё понятно: b7 - узнанный сканкод. 127 - числовое значение KEY_COMPOSE.

После этого, всё, что использует драйвер evdev, будет воспринимать кнопку PrtScr как Menu. Трюк с setkeycodes будет работать везде, где используется evdev. Стоит отметить, что сканкод платформо-специфичен. Под платформой понимается: AT PS/2, USB HID и т.п. Об этом планирую в другой статье рассказать.

Естественно после всех манипуляций выше вы лишаетесь кнопки Print Screen, но его функциональность в части снятия скриншотов это просто условность и можно настроить окружение так, что бы работала другая комбинация. А можно переназначить другую клавишу аналогичным способом. К примеру, F12. Лично я её использую очень редко. В терминале она вообще эмулируется Shift+F2 (для F11 - Shift+F1).

Другим решением может стать использовать кнопки Launch1: ThinkPad T530: делаем из кнопки Launch1 - SysRq

Полезные ссылки на тему:

  1. man 8 setkeycodes
  2. man 1 loadkeys - если хочется магии в консоли.

// Обновление Linux Mint 17.3 до 18...

Или разлепляем пельмени, а потом собираем их обратно. Пару заметок.

Собственно разработчики Linux Mint всегда рекомендовали использовать новую установку вместо того, что бы просто обновлять систему. Несколько релизов я всё же обновлялся путём исправления репозиториев и apg-get upgrade / apt-get dist-upgrade. При выходе 18 версии дистрибутива авторы выложили инструмент и инструкцию для сего обновления:

Как обычно проблемы кроятся в мелочах. А именно: не учитывается влияние PPA от слова совсем.

// Thinkpad T530 BIOS Update

Снова мемориз.

  1. Находим BIOS тут или по модели тут. Скачиваем ISO. Не смущаемся наличием в описании разных Windows.
  2. Используем руководство отсюда. В частности, как использовать GRUB2, что бы не шить ISO никуда. У меня не сработало - зависание программы прошивальщика после первого подтверждения своих намерений. Помог способ с загрузочной флешкой. Конспективно:
    ./geteltorito.pl -o xxx.img xxx.iso 
    sudo dd if=xxx.img of=/dev/sdX
    • Перезагружаемся, выбираем флешку как источник загрузки и грузимся с неё. Дальше всё понятно.

Опционально проверяем версию BIOS и время релиза из системы:

sudo dmidecode -s bios-version
sudo dmidecode -s bios-release-date

// Обновление в статьях

Изрядно обновил статью Linux, ThinkPad T530 и miniDP (displayport), поместил ссылку на неё в Статьи. Если коротко: то в общем и целом настройка чуть упростилась и улучшилась. Но дёготь остался, куда без него.

// ThinkPad T530, WiFi и DEAUTH_LEAVING

После экспериментов с роутером Zyxel Keenetic 4G II (прошил неофициальную прошивку серии V1 (V1.11.RU.NDMS), на родной серии V2 непредсказуемо работал multicast IPTV) заметил, что WiFi стал работать как-то нестабильно (затыки с сайтами, постоянный реконнект у мессенджеров). Временами, но стабильно, стал вылазить диалог с просьбой ввести пароль от точки. Будто бы порвалась связь и не получилось подключиться с какого-то количества попыток.

Размышляя, что менял (ну кроме самой прошивки), вспомнил, что я переключил WiFi с режима 11b/g на режим 11b/g/n (раньше прошивка читалки не могла цепляться, если AP в таком режиме, после прошивку исправили, а настройки так и остались). Действительно, когда я переключил роутер обратно в режим 11b/g, то всё стало на свои места, так что не прошивка виновата. Казалось бы - решение найдено, но такой путь - не наш метод (хотя… если ничто другое не помогает, то лучше синица в руках, чем журавль в небе).