среда, 25 ноября 2020 г.

Регулирование оборотов вентилятора для Raspberry PI

Накрылся вентилятор в HTPC на базе Gigabyte Brix и пока из Китая не пришел новый вентилятор приходится обходиться заменой на базе Raspberry PI 4. Проблема четвертого Raspberry в заметном нагреве по сравнению с тем же Raspberry PI 3 и чтобы он не перегревался я брал корпус с активным охлаждением. Мелкий кулер заметно шумит, а если отключить его, то Raspberry быстро нагревается до 60 градусов и выше.

воскресенье, 25 октября 2020 г.

Миграция etckeeper с mercurial на git

В начале 2012 года я начал использовать etckeeper для отслеживания изменения в /etc. Тогда я использовал Mercurial в качестве системы контроля версий и было очевидным использовать его в качестве бэкенда хранения для etckeeper.

Двумя годами позже я сменил место работы и целиком переключился на Git. Все новые инсталляции уже использовали Git для etckeeper, но домашний сервер и ноутбук все еще оставались на Mercurial. Где-то в районе выхода Debian Jessie ноутбук перешел на Git при миграции с i386 на amd64. А сервер оставался на Mercurial до сегодняшнего дня, но несколько попыток починить такую ошибку привели к миграции:

/etc/cron.daily/etckeeper:
abort: path contains illegal component: .hg/undo.dirstate
abort: path contains illegal component: .hg/undo.backup.dirstate
abort: path contains illegal component: .hg/undo.dirstate
abort: path contains illegal component: .hg/undo.backup.dirstate

Когда-то я уже описывал процесс миграции с Mercurial на Git с использованием расширения hg-git, но в этот раз решил попробовать сделать по инструкции с git-scm.com

суббота, 24 октября 2020 г.

Midnight Commander 4.8.25 для Ubuntu Groovy

Добавил в свой репозитарий поддержку Ubuntu Groovy (20.10) и собрал пакеты Midnight Commander 4.8.25 для архитектур amd64, armhf и arm64.

Сейчас версия совпадает с той, которую предоставляет Ubuntu, но ситуация скорее всего изменится с выходом Midnight Commander 4.8.26.

воскресенье, 18 октября 2020 г.

Ускорение сборки в pbuilder на Raspberry PI 4

Дошли руки починить сборку Midnight Commander для ARM. Раньше я использовал qemu-user-static и qemu-system-arm для сборки пакетов для архитектур armel, armhf и arm64, но это было медленно и часто заканчивалось ошибками или зависанием сборки. Начиная с Raspberry PI 3 появилась поддержка ARM64 и теперь можно собирать пакеты не прибегая к помощи эмулятора.

После снижения цен на Raspberry PI 4 с 2GB до 35$ я заказал себе такую на Seeedstudio и вдобавок корпус с активным охлаждением. Но если гонять pbuilder на SD карте это будет медленно и карта довольно быстро придет в негодность. Чтобы этого избежать я выношу весь /var/cache/pbuilder на NFS, который раздает домашний сервер. Такой подход хорошо работает с базовыми образами, кешем APT и результатами сборки, но слишком медленный для /var/cache/pbuilder/build/. В этой директории pbuilder хранит распакованные chroot'ы и эти файлы не важны. Чтобы ускорить сборку можно смонтировать tmpfs и сборка будет упираться в процессор, а не в I/O.

воскресенье, 11 октября 2020 г.

Обновление прошивок на ноутбуках

 Сегодня погода на улице не заладилась - для октября непривычно тепло, но идет дождь, сыро и грустно без солнца. Отличный день чтобы заняться рутинными делами и обновить прошивки на ноутбуках. На сайте dell.com нашлись обновления для всех машинок в семье - даже для старичка Inspiron N5050 этим летом выпустили обновление.

На более новых Latitude e7*70 обновить прошивку можно с флешки, но для Inspiron N5050 нужно готовить загрузочный образ с DOS. Для этого я использую образ с FreeDOS в который дописываю файлы прошивок. Я прошивал себе последнюю версию A05, но на всякий случай в образ закинул все версии от A01 до A05.

Как всегда никаких гарантий не предоставляется - используете на свой страх и риск :)

четверг, 8 октября 2020 г.

Неудачный аккумулятор для Dell Inspiron N5050

Достался мне Dell Inspiron N5050 с родным, но полностью мертвым аккумулятором. На AliExpress был заказан новый с большей емкостью (6800mAh против 4400mAh у родного). Через полтора месяца ожидания курьер СДЭК доставил посылку.

Новая батарея отлично подошла по размерам, но уже на следующий день ребенок пожаловался что ноутбук просто выключился и не включался пока не был подключен к зарядному. Очень похоже на полный разряд батареи, но ведь на 20% должно было быть предупреждение о низком заряде, а на 10% ноутбук должен засыпать на диск. Но ничего такого не произошло...

На следующий день ситуация повторилась и я начал разбираться. Ноутбук с включенным экраном потребляет ток около 950mA. Следовательно полностью заряженного аккумулятора емкостью 6800mAh должно хватить на примерно 7 часов работы. Но уже через 3 часа работы ноутбук отключается и это явно указывает на проблемы с новой батареей.

Поставил battery-stats и он показал довольно забавную картину - с полностью заряженной ноутбук отключится примерно через 3 часа на 55-56% зарядки. Пока не подключишь к зарядному ноутбук не реагирует на кнопку включения - значит сработала защита батареи от глубокого разряда. Если включить зарядку, то после загрузки уровень заряда равен 0% и график заряда идет плавно до 44%, а затем внезапно становится 100%.

Если снова разрядить батарею до нуля и затем зарядить только до 40%, то поведение в корне меняется. На 20% появляется предупреждение о низком заряде батареи, а на 10% загорается красный индикатор заряда и ноутбук уходит в спящий режим.

Подобное поведение косвенно указывает на реальную емкость батареи в районе 3000mAh, а проблемы с внезапным отключением связаны контроллером зарядки, который считает емкость как 6800mAh. С учетом того что внутри 6 ячеек по схеме 3S2P (по две банки в параллель и три сборки последовательно), то выходит что емкость одной ячейки около 1500mAh вместо обещанных 3400mAh.

Руки чешутся разобрать батарею, чтобы проверить эту теорию, но пока просто написал продавцу - посмотрю что он мне ответит. Вариант с бракованной батареей пока не исключаю.

воскресенье, 6 сентября 2020 г.

Посыпался диск в RAID

Какая-то черная полоса с техникой - сначала накрылась посудомойка, потом регистратор, а сегодня сервер домашней сети решил что весь мир подождет.

Nagios прояснил картину двумя алертами

Заглядываю в dmesg сервера, а там непрерывный поток ошибок, связанный с одним из дисков.

суббота, 5 сентября 2020 г.

Замена аккумулятора в планшете Samsung Galaxy Note Pro 12.2 (SM-P900)

Родная батарея планшета начала сдаваться после 6 лет службы. Сначала планшет отключался при 30-40% заряда если запущена игра. Затем стал выключаться на загрузке страниц сайтов где много сложной верстки или есть динамические элементы. В общем единственное на что он остался годен - это чтение PDF в формате A4 (большая диагональ в 12.2" и разрешение 2560x1600 к этому располагает).

В принципе если не брать игрушки, то производительности планшета вполне хватает на повседневные нужды. Нужно лишь поменять родную батарею. Поискал в интернете модель - в эти планшеты ставили аккумуляторы серии T9500 с заявленной емкостью на 9500mAh и номинальным напряжением 3.8V. Номинальное напряжение в 3.8V означает что такой аккумулятор можно заряжать до 4.35V, что отличается от привычных 4.2V для аккумуляторов с номинальным напряжением в 3.6V и 3.7V.

воскресенье, 23 августа 2020 г.

Черный экран при выходе из hibernate

Иногда после выхода из спящего режима нет изображения на экране ноутбука. Чаще это случается если ноутбук ушел в спящий режим подключенным к док-станции (в этом случае изображение выводится на два внешних монитора, а экран ноутбука отключен), а выходит из спящего режима будучи отключенным от док-станции. В такой момент можно подключиться по SSH и сделать перезагрузку или попытаться переключиться в консоль и затем обратно в иксы. Иногда последнее помогает, но не всегда. Не помню конда это началось, но из-за нехватки времени и спонтанности ошибки решение откладывалось до лучших времен. Сегодня воспроизвелось еще раз и пора с этим разобраться.

Отключение Bluetooth и WWAN при загрузке системы

На ноутбуке есть три беспроводных устройства (wifi, bluetooth и wwan) из которых постоянно используется только wifi. Чтобы не засорять эфир остальные устройства отключались вручную после загрузки. Хотя ноутбук перезагружается редко, но делать одно и тоже руками надоедает. Скрипт, который автоматически отключает bluetooth и wwan выглядит так (/usr/local/sbin/rfkill-boot-settings.sh)

#!/bin/sh

RFKILL_TYPE="bluetooth wwan"
RFKILL_BIN=/usr/sbin/rfkill

if [ ! -x "${RFKILL_BIN}" ]; then
    echo "Error: rfkill is not installed" >&2
    exit 1
fi

# shellcheck disable=SC2086
for RFKILL_ID in $(${RFKILL_BIN} list -n -o ID ${RFKILL_TYPE})
do
    # Some devices are nested and dissapear when parent device is blocked
    if ${RFKILL_BIN} list -n -o ID | grep -Eq '^\s+'${RFKILL_ID}'$'; then
        echo "Disabling ${RFKILL_ID}"
        ${RFKILL_BIN} block ${RFKILL_ID}
    else
        echo "Skipping ${RFKILL_ID}"
    fi
done

Автоматически запускать можно из /etc/rc.local или через systemd (/etc/systemd/system/rfkill-boot-settings.service)

пятница, 1 мая 2020 г.

Xfce4 не блокирует экран при закрывании крышки ноутбука

На ноутбуке установлен Xfce4 4.14 который я пересобрал под Debian Buster. Пока в качестве реакции на закрывании крышки ноутбука был настроен hibernate - экран блокировался, но стоило перейти на suspend - экран перестал блокироваться. Если отправить ноутбук в спячку нажатием кнопки Sleep, то блокировка работает.

Полез смотреть логи, для этого запустил в терминале journalctl -f и закрыл крышку. После просыпания увидел следующие записи:

May 01 20:03:42 dragoncore systemd-logind[711]: Lid closed.
May 01 20:03:42 dragoncore systemd-logind[711]: Suspending...
May 01 20:03:42 dragoncore NetworkManager[710]:   [1588352622.0356] manager: sleep: sleep requested (sleeping: no  enabled: yes)
May 01 20:03:42 dragoncore NetworkManager[710]:   [1588352622.0356] manager: NetworkManager state is now ASLEEP
May 01 20:03:42 dragoncore systemd[1]: Reached target Sleep.
May 01 20:03:42 dragoncore systemd[1]: Starting Suspend...
May 01 20:03:42 dragoncore systemd-sleep[2418]: Suspending system...
May 01 20:03:42 dragoncore kernel: PM: suspend entry (deep)
May 01 20:03:42 dragoncore kernel: PM: Syncing filesystems ... done.

Значит событие закрывания крышки ноутбука обработал logind, а не xfce4-power-manager.

вторник, 31 марта 2020 г.

Собрал пакет для acme.sh версии 2.8.5

Версия 2.8.5 вышла еще в январе, но обновить пакет в моем репозитарии руки дошли только вчера. Последняя версия добавлена в репозитарий только для Debian Buster и Debian Sid, но пакет acme.sh_2.8.5-1_all.deb должен устанавливаться на другие версии Debian/Ubuntu без проблем.

Из заметных изменений:
  • Добавил страницу man для acme.sh
  • Исправил предупреждения lintian
  • Поменял структуру для deploy/dnsapi/notify хуков - есть подозрение что в предыдущих релизах они не работали, но протестировать их мне не довелось

воскресенье, 29 марта 2020 г.

Конфигурация сенсоров в arduino-air-sensors

Сделал обновление для моего проекта arduino-air-sensors - теперь есть возможность настраивать конфигурацию плат с контроллерами esp8266. Последняя ревизия кода поддерживает сенсоры DHT22/AM2302, BME280, SI7021, MH-Z19 и OLED экран на базе контроллера SSD1306.

Прошивку тестировал на платах ESP01 и ESP12S - получились такие конфигурации:
  • ESP01 + SI7021 (SI7021 подключен к GPIO0/GPIO2)
  • ESP01 + BME280 (BME280 подключен к GPIO0/GPIO2)
  • ESP12F + DHT22 + MH-Z19 + SSD1306 (SSD1306 подключен к GPIO4/GPIO5, DHT22 к GPIO14, a MH-Z19 к GPIO15/GPIO13).
В последней конфигурации используется переключение UART0 с GPIO1/GPIO3 на  GPIO15/GPIO13. До этого пробовал использовать библиотеку SoftwareSerial но работает она нестабильно.

Еще заказал на пробу AHT10 - это датчик температуры и влажности для шины I2C.

среда, 18 марта 2020 г.

Обновление OpenWrt на TP-Link Archer C6

В начале марта вышло обновление OpenWrt (список изменений в 19.07.2). Для обновления прошивки предлагается два способа:
  1. Web интерфейс LUCI 
  2. Командная строка
Для себя я выбрал вариант с обновлением через командную строку

# export OPENWRT_RELEASE=19.07.2

# cd /tmp

# wget http://downloads.openwrt.org/releases/${OPENWRT_RELEASE}/targets/ath79/generic/openwrt-${OPENWRT_RELEASE}-ath79-generic-tplink_archer-c6-v2-squashfs-sysupgrade.bin

Downloading 'http://downloads.openwrt.org/releases/19.07.2/targets/ath79/generic/openwrt-19.07.2-ath79-generic-tplink_archer-c6-v2-squashfs-sysupgrade.bin'
Connecting to 176.9.48.73:80
Writing to 'openwrt-19.07.2-ath79-generic-tplink_archer-c6-v2-squashfs-sysupgrade.bin'
openwrt-19.07.2-ath7 100% |*******************************|  4544k  0:00:00 ETA
Download completed (4653342 bytes)

# wget http://downloads.openwrt.org/releases/${OPENWRT_RELEASE}/targets/ath79/generic/sha256sums

Downloading 'http://downloads.openwrt.org/releases/19.07.2/targets/ath79/generic/sha256sums'
Connecting to 176.9.48.73:80
Writing to 'sha256sums'
sha256sums           100% |*******************************|   140k  0:00:00 ETA
Download completed (143764 bytes)

# sha256sum -c sha256sums 2>/dev/null | grep OK

openwrt-19.07.2-ath79-generic-tplink_archer-c6-v2-squashfs-sysupgrade.bin: OK

# sysupgrade -v /tmp/openwrt-${OPENWRT_RELEASE}-ath79-generic-tplink_archer-c6-v2-squashfs-sysupgrade.bin

Saving config files...
etc/config/dhcp
etc/config/dropbear
etc/config/firewall
etc/config/luci
etc/config/network
etc/config/rpcd
etc/config/system
etc/config/ubootenv
etc/config/ucitrack
etc/config/uhttpd
etc/config/wireless
etc/dropbear/dropbear_rsa_host_key
etc/group
etc/hosts
etc/inittab
etc/luci-uploads/.placeholder
etc/opkg/keys/0b26f36ae0f4106d
etc/opkg/keys/1035ac73cc4e59e3
etc/opkg/keys/5151f69420c3f508
etc/opkg/keys/72a57f2191b211e0
etc/opkg/keys/792d9d9b39f180dc
etc/opkg/keys/9ef4694208102c43
etc/opkg/keys/b2d571e0880ff617
etc/opkg/keys/b5043e70f9a75cde
etc/opkg/keys/c10b9afab19ee428
etc/opkg/keys/dace9d4df16896bf
etc/opkg/keys/dd6de0d06bbd3d85
etc/opkg/keys/f94b9dd6febac963
etc/passwd
etc/profile
etc/rc.local
etc/shadow
etc/shells
etc/sysctl.conf
Commencing upgrade. Closing all shell sessions.

Через несколько минут обновление прошики закончилось.

четверг, 20 февраля 2020 г.

Установка OpenWrt на TP-Link Archer C6 v2

Какое-то время назад я обновил wifi точку доступа TP-Link TL-WA901ND на роутер TP-Link Archer C6(RU) v2 ради поддержки диапазона 5GHz. Примерно месяц я пользовался роутером на штатной прошивке в режиме точки доступа - скорость по 5GHz отличная, в диапазоне 2.4GHz тоже соответствует ожиданиям. В принципе можно было и дальше пользоваться этой прошивкой, но не было возможности отключить режим WPS и с отключенным DHCP сервером не показывало список подключенных клиентов.

После выхода релиза OpenWrt 19.07.0 решил попробовать альтернативную прошивку. Инструкция по обновлению прошивки на английском языке есть на сайте OpenWrt. Обновить прошивку из web интерфейса штатной прошивки не получилось. Пришлось делать установку через метод TFTP.

среда, 5 февраля 2020 г.

Изменения в моем репозитарии

В моем репозитарии произошло несколько изменений:
  • Собрал пакеты для Midnight Commander 4.8.24 под ARM.
  • Добавил поддержку Ubuntu Eoan.
  • Удалил из репозитария Ubuntu Cosmic и Ubuntu Disco из-за EOL.

Как скачать лог Stackdriver

Журналирование в GCP реализовано через Stackdriver Logging. На прошлой неделе пришлось обратиться в техническую поддержку Google по поводу поломанной работы с зависимостями в AI Platform (ML Engine). Для тикета нужно было скачать логи заданий с ошибкой и без нее. Если пытаться выгружать логи через консоль GCP, то сохранит только ту часть, который видна в данный момент в интерфейсе (в моем случае это малая часть от полного лога).

Чтобы выгрузить весь лог целиком воспользуемся консольной командой gcloud logging read. В моем случае для успешной задачи ML Engine фильтр будет resource.labels.job_id="some_successful_ml_job" timestamp>="2020-01-27T14:28:43Z" а для задания с ошибкой: resource.labels.job_id="some_failed_ml_job" timestamp>="2020-01-30T13:42:58Z" (чтобы использовать этот запрос в команде нужно экранировать двойную кавычку).

gcloud logging read "resource.labels.job_id=\"some_successful_ml_job\" timestamp>=\"2020-01-27T14:28:43Z\"" --format=json --order=asc > success.json
gcloud logging read "resource.labels.job_id=\"some_failed_ml_job\" timestamp>=\"2020-01-30T13:42:58Z\"" --format=json --order=asc > failure.json

Для удобства чтения я извлекаю из JSON только сам текст сообщения (узнать больше о фильтрации в jq можно тут).

jq -r .[].jsonPayload.message < success.json > success.txt
jq -r .[].jsonPayload.message < failure.json > failure.txt

вторник, 28 января 2020 г.

Midnight Commander 4.8.24

Лучше поздно, чем никогда - собрал пакеты для Midnight Commander 4.8.24 и выложил в свой репозитарий.

Заодно немного статистики по загрузкам:
  • за последние 12 часов пакет был скачан 86 раз
  • в лидерах по количеству загрузок Ubuntu: 36 Bionic, 16 Xenial, 6 Disco
  • 80 загрузок для amd64 и 6 загрузок для i386

вторник, 14 января 2020 г.

Ошибка при создании Cloud Functions через Terraform

При очередном тестировании конфигурации Terraform выдал ошибку при создании Cloud Functions в GCP: googleapi: Error 403: Your application has authenticated using end user credentials from the Google Cloud SDK or Google Cloud Shell which are not supported by the cloudfunctions.googleapis.com. We recommend that most server applications use service accounts instead. For more information about service accounts and how to use them in your application, see https://cloud.google.com/docs/authentication/.

Для работы с Terraform я использую авторизацию приложения с правами пользователя (application default credentials). Это продиктовано требованиями безопасности, да и в целом это имеет смысл т.к. приложение выполняет изменения в GCP от моего имени. Если использовать сервис аккаунт, то все работает без проблем, но тогда либо нужно создавать по отдельному сервис аккаунту на каждого пользователя, либо смириться с проблемами аудита.