Портрет 4X_Pro
Был в Сети 19 сент. 2025 г., 02:55
Мультиблог
4X_Pro
Кратко о себе: Web-разработчик. Пишу на PHP, Python, JavaScript. Знаю Ruby и Go, со студенческих времён более-менее помню C и asm. Специализируюсь на ускорении загрузки сайтов и разработке ботов для Telegram. Linuxоид (использую Debian+LXDE). Сторонник IndieWeb, slow lifer.

Социальные сети


Новости сайта в Telegram

t.me/4x_pro

Компьютерное

Некоторые тонкости использования образов qcow2 на desktop

4X_Pro

Сегодня узнал, что для Debian (равно как и многих других дистрибутивов) можно скачать готовый образ в формате qcow2 для libvirt-qemu вместо установки из ISO-образа. Но, как выяснилось, есть некоторые нюансы. Во-первых, для виртуализации на обычном desktopе нужно качать образы nocloud, а не genericcloud. В запущенную машину на genericcloud просто не получится зайти из-за того, что пароли пользователей в ней не заданы, а предполагается, что ключ для входа под SSH будет загружен средствами openstack. Во-вторых, образ по умолчанию имеет размер всего 3 Гб, и нужно его увеличивать в два этапа.
Первый — на хосте изменить размер образа с помощью команды qemu-img:
sudo qemu-img resize /var/lib/libvirt/images/debian-12-nocloud-amd64-20250804-2194.qcow2 размер
Размер можно указать либо желаемый итоговый (например, 20G), либо на сколько увеличить (например, +17G).
Второй этап — в виртуальной машине сделать apt update (без чего apt просто не найдёт никакие пакеты), установить cloud-guest-utils и выполнить команду growpart:
sudo apt update sudo apt install cloud-guest-utils sudo growpart /dev/vda 1
Где /dev/vda — путь к виртуальному диску, 1 — номер раздела.
И ещё момент: при подключении образа нужно в качестве типа подключения указывать VirtIO вместо SATA, это ускоряет работу с диском.

Автоматическая очистка почты при использовании Dovecot

4X_Pro

Если есть необходимость регулярно удалять старые письма, и на сервере в качестве почтового сервера используется Dovecot, то можно прописать в cron такую команду:
мин час * * * /usr/bin/doveadm expunge -u пользователь mailbox ящик savedbefore период
Например, так 0 4 * * * /usr/bin/doveadm expunge -u nospam@4xpro.ru mailbox Inbox savedbefore 30d
Типичные значения для ящика: Inbox (Входящие), Outbox (Исходящие), Trash (Корзина), Spam.
Так же есть возможность выполнить команду для всех пользователей, использовав вместо -u пользователь аргумент -A.

Как удалить alias для одного из доменов Let's Encrypt

4X_Pro

Недавно столкнулся, что на одном сервере certbot перестал обновлять сертификаты. Стал разбираться, в чём дело, и обнаружил, что происходит это из-за того, что все домены, которые обслуживает сервер, были прописаны в одном сертификате как aliasы, а потом один из поддоменов перенесли на другой сервер. В результате не проходила проверка владением домена (request challenge).
Возник вопрос, как удалить этот alias, чтобы сертификат продолжал обновляться для всех остальных доменов. Как выяснилось, готовой команды «перегенирировать сертификат для всех aliasов, кроме указанного» нет. Нужно вручную указывать все домены, кроме ненужного. Делается это так:
sudo certbot certificates
Там смотрим имя сертификата после строки Certificate Name: далее — список доменов для него после Domains.
Копируем этот список, заменяем пробелы на запятые, убираем ненужный домен. После этого запускаем команду
sudo certbot --cert-name имя_сертификата -d список_доменов
После этого certbot отработал нормально, новый сертификат сгенерировался без проблем.

Как починить повреждённый GRUB

4X_Pro

Пару раз сталкивался с тем, что GRUB переставал работать, проваливаясь в выдавая ошибки вроде grub error symbol grub_disk_native_sectors not found. Чаще всего такое случается при некорректном обновлении, когда основная часть загрузчика (установленная в загрузочный сектор) обновилась, а модули в /boot/grub — нет, или наоборот, но могут быть и другие причины.
Что делать в таких случаях. Во-первых, можно попытаться загрузить Linux вручную с помощью команд:
insmod linux set root=/dev/sdaX linux /boot/vmlinuz-y.z-u-generic root=/dev/sdaX initrd /boot/initrd.img-y.z-u-generic boot
Вместо sdaX нужно указать свой раздел (например, /dev/sda1) , а вместо y.z-u-generic — свою версию ядра. Её можно посмотреть с помощью команды ls. Сначала ls покажет список устройств, которые видит grub вида (hd0,msdos1), (hd0,msdos2), (hd1). Дальше нужно повторить ls для каталога /boot с указанием имени устройства перед ним. Т.е. ls (hd0,msdos1)/boot. Дальше выбрать подходящий файл vmlinuz и соответствующий ему initrd (они должны быть одинаковой версии).
Однако в случае повреждения некоторых модулей GRUB такое не работает, начинаются ошибки после команд insmod или linux. Тогда есть два варианта. Либо найти установочный диск/флешку той же версии системы, что установлена на компьютере, и загрузиться с неё. Но загрузочный образ может быть весьма большим, поэтому может оказаться проще использовать другое решение — SuperGrub 2 Disk. Это крошечный образ ISO (менее 20 Мб), в котором есть только загрузчик GRUB с таким файлом конфигурации, который умеет автоматически находить операционные системы на всех доступных разделах, и начинать процесс загрузки. Очень удобно, если нужно чинить GRUB на удалённом сервере с возможностью монтирования ISO через KVM.
После того, как загрузиться удалось, нужно переустановить GRUB командой
sudo grub-install /dev/sdaX
В Debian-подобных системах имеет смысл также обновить файл конфигурации GRUB с помощью команды sudo update-grub.

Переключение по CapsLock в Windows 10 с помощью Switchy

4X_Pro

Наконец-то нашёл приемлемое решение для переключения по CapsLock под Windows 10, которое может заменить ReCaps или CapsLang — приложение Switchy с открытым исходным кодом (скачивать надо на странице Releases). Написано на чистом WinAPI с EXE-файлом всего в 12 Kb. Запускать нужно с параметром nopopup, иначе при каждом переключении будет мелькать раздражающее окно с индикацией раскладки. Корректно работает даже в WSL и современных Windows-приложениях. В общем, именно таким и должен быть софт!

Если Windows не видит NVMе-накопитель

4X_Pro

При установке Windows 10 на ноутбуки с процессорами Intel последних поколений NVMe-накопителем часто возникает ситуация, когда установщик Windows не показывает ни одного раздела, куда можно произвести установку. Объясняется это тем, что тем, что в чипсетах для процессоров 11 и более поздних поколений для работы с NVMe используется технология VMD. Для её работы BIOS (точнее, UEFI) подменяет реальные контроллеры NVMe на контроллер RST VMD. Но драйвера для него в дистрибутиве Windows 10 отсутствуют, поэтому установщик и не видит накопителя.
Решить эту ситуацию можно двумя способами. Первый — зайти в BIOS и отключить использование технологии VMD (в ноутбуках от неё всё равно пользы немного). Второй — это на другом компьютере скачать драйвер RST VMD либо с сайта Intel (но он сейчас скачивание недоступно без VPN), либо с сайта какого-либо производителя ноутбуков, например, Lenovo (драйвер от производителя не зависит и должен подойти к любым ноутбукам). Далее нужно запустить скачаный EXE-файл, выбрать Extract вместо Install и распаковать драйвера на флешку (можно на флешку с дистрибутивом самого Windows, можно на отдельную). Далее начать установку Windows 10, на этапе выбора раздела нажать кнопку "Загрузить" и там указать путь к драйверу на флешке. После этого установщик должен написать, что найдено устройство Intel RST VMD, загрузить драйвер и найти раздел (возможно, потребуется нажать кнопку "Обновить"). Дальше установка должна пройти без проблем.

Отслеживаем время запросов в Apache и NGinx

4X_Pro

Я уже писал о том, как отслеживать медленные запросы с помощью MySQL. Но не всегда причина бывает в базе данных. Поэтому имеет смысл применять и другой способ — использовать логи Web-серверов. В современных версиях Apache и NGinx есть возможность выводить в лог время выполнения запроса с точностью до миллисекунд.
В NGinx это делается так: сначала объявляем формат лога с помощью директивы log_format и придумываем ему имя, например, logtimed. Возьмём за основу формат по умолчанию, и добавим к нему время выполнения и длину запроса. А потом объявим использование этого формата в директиве access_log:
log_format combined '$remote_addr - $remote_user [$time_local] '                     '"$request" $status $body_bytes_sent '                     '"$http_referer" "$http_user_agent" '                     ' $request_time $request_length'; access_log /var/log/nginx/access.log logtimed
Директива может использоваться на любом уровне (http, server, location), но в документации сказано, что следует использовать тот же, на котором прописана директива root.

В Apache требуется включить mod_log_config. Далее всё делается аналогично, только директивы называются LogFormat и CustomLog, а вывод времени запроса можно задать двумя способами — либо как %D (в микросекундах), либо как %msT (с версии 2.4.13) — в миллисекундах, либо как %T — в сеундах:
LogFormat "%h %l %u %t \"%r\" %>s %b %D" logtimed CustomLog /var/log/apache2/access.log logtimed
Эти директивы можно использовать либо в глобальной конфигурации, либо на уровне VirtualHost.
Надеюсь, эта информация поможет выявить медленные запросы и сделать ваши сайты и сервисы быстрее.

Просмотр S.M.A.R.T. под Linux

4X_Pro

Почти во всех современных жестких дисках есть встроенная система мониторинга состояния, называемая S.M.A.R.T., позволяющая выявить многие проблемы еще до того момента, как диск Но часто возникает вопрос: как посмотреть эти параметры, чтобы убедиться, что с диском все в порядке?
Обычно рекомендуют поставить утилиту smartctl (в большинстве дистрибутивов она идет в пакете smartmontools). Посмотреть параметры с помощью нее можно командой
sudo smartctl -a /dev/sdX
где вместо sdX нужно подставить имя конкретного устройства (sda, sdb и т.д.)
Но эта утилита предназначена для регулярного мониторинга, и при установке создает службу smartd, что нужно далеко не всегда. Поэтому возникает желание найти утилиту, которая только показывает SMART-параметры по запросу и ничего больше. Как выяснилось, в Mint Linux это умеет делать утилита hddtemp, установленная по умолчанию. Для этого ее нужно запустить в отладочном режиме:
sudo hddtemp /dev/sdX -D
Главный ее недостаток — утилита не показывает описания полей SMART-параметров, а только их номера. Но обычно требуется посмотреть только несколько основных, что можно сделать по номерам:
3 — Spin_Up_Time — время раскрутки диска.
5 — Reallocated_Sector_Ct — количество переназначенных секторов, если оно не равно нулю, диск начал разрушаться, и желательно его скорее заменить (кроме того, на большинстве дисков появление таких секторов ведет к падению производительности).
7 — Seek_Error_Rate — количество ошибок чтения из-за позиционирования головок диска.
10 — Spin_Retry_Count — количество повторных раскруток.
197 — Current_Pending_Sector — количество секторов, отмеченных как неустойчивые (кандидаты в relocated).
198 — Offline_Uncorrectable — количество неисправных секторов.

Оптимизация всех таблиц в базе MySQL

4X_Pro

Часто возникает вопрос: как оптимизировать все таблицы в базе данных MySQL сразу. Сделать это через обычные запросы OPTIMIZE TABLE, к сожалению, невозможно. Ставить только ради этого действия phpMyAdmin или Adminer тоже не всегда целесообразно.
Но в MySQL и MariaDB есть стандартная утилита командной строки mysqlchk, которая умеет это делать. Вызывается она так:
$ mysqlchk -o имя_базы -u логин -p
Если нужно выполнить оптимизацию всех баз сразу, то вместо имени базы нужно указать ключ -A или --all-databases. Кроме того, утилита умеет выполнять и другие операции (их нужно указывать вместо опции -o):

  • -a — анализ таблиц (запрос ANALYZE TABLE)
  • -с — проверка таблиц (запрос CHECK TABLE)
  • -r — восстановление таблиц (запрос REPAIR TABLE).

Задержка при загрузке Ubuntu 18.04

4X_Pro

Обновился несколько дней назад с Lubuntu 16.04 до Lubuntu 18.04 и столкнулся со странной проблемой: компьютер стал очень долго загружаться. Утилита systemd-analyze показывала, что задержка возникает не в user space, а при загрузке ядра. Из dmesg было видно, что где-то на третьей секунде загрузки ядра компьютер останавливается и ждет 30 секунд без каких-либо ошибок, после чего продолжает загрузку как обычно.
Изначально я предполагал, что ошибка где-то в драйверах. Но после нескольких дней экспериментов и поисков в Google выяснилось следующее: при загрузке Linux пытается восстановиться из состояния гибернации из swap, который у меня отсутствует, и система останавливается, пытаясь считать содержимое памяти неизвестно откуда.
Решается это просто: в параметрах ядра при загрузке нужно указать параметр noresume. В случае, если используется загрузчик GRUB, нужно отредактировать файл /etc/default/grub: строку
GRUB_CMDLINE_LINUX_DEFAULT="quiet" заменить на GRUB_CMDLINE_LINUX_DEFAULT="quiet noresume"
После этого нужно выполнить
$ sudo /usr/sbin/update-grub для того, чтобы был сгенерирован новый файл /boot/grub/grub.cfg. При следующей перезагрузке проблема исчезает.


Страницы:
Задать вопрос