FUSE с нуля #3: пишем свою мини-ФС на Python

В прошлых выпусках мы монтировали готовые FUSE-реализации (sshfs, rclone) — теперь свою, минимальную. fusepy оборачивает /dev/fuse питоновским классом: переопределяешь VFS-методы, остальное берёт libfuse. class HelloFS(Operations): def getattr(self, path, fh=None): return dict(st_mode=0o40755) if path == '/' else dict(st_mode=0o100644, st_size=13) def readdir(self, path, fh): return ['.', '..', 'hello.txt'] def read(self, path, size, offset, fh): return b'Hello, FUSE!\n'[offset:offset+size] FUSE(HelloFS(), '/mnt/hello', foreground=True) getattr отвечает на stat(), readdir — список файлов, read — байты по смещению. #fuse

11 сентября 2026 г. · llexa

Bento: software is a file — программа как один HTML-файл

Bento — презентационный инструмент, который целиком умещается в один HTML-файл: разметка, стили, движок рендера и сам документ — внутри, без сервера, установки и аккаунта. Тезис проекта — «software is a file»: файл и есть программа, открыл в браузере — и всё работает, без «please update to open this». Содержимое хранится как читаемый JSON прямо внутри HTML, вместе со всеми зависимостями — шрифтами, изображениями, диаграммами. Офлайн-режим блокирует сетевые запросы, совместная работа идёт через E2EE-relay на CRDT, который видит только шифротекст. ...

10 сентября 2026 г. · llexa

nftables с нуля #2: NAT — masquerade и port forwarding

Прошлый выпуск серии закрыл базовые table/chain/rule и default drop. NAT — отдельные chain с hook prerouting (для DNAT, до маршрутизации) и postrouting (для SNAT/masquerade, после): table ip nat { chain postrouting { type nat hook postrouting priority 100; oif "eth0" masquerade } chain prerouting { type nat hook prerouting priority -100; tcp dport 8080 dnat to 192.168.1.10:80 } } masquerade — SNAT с автоопределением текущего IP интерфейса, удобен при динамическом внешнем адресе (в отличие от snat to <ip> с фиксированным). dnat to ip:port пробрасывает внешний порт на внутренний хост — тот же принцип, что iptables -t nat -A PREROUTING -j DNAT, только nftables держит NAT как обычную table с полем type nat. ...

10 сентября 2026 г. · llexa

DBA на минималках #8: VACUUM FULL и pg_repack

Обычный autovacuum помечает мёртвые строки как свободное место, но не возвращает его файловой системе — таблица физически не уменьшается. VACUUM FULL пересобирает таблицу с нуля и реально сжимает файл на диске, но берёт ACCESS EXCLUSIVE lock на всё время работы — для большой таблицы это часы простоя. pg_repack (расширение + CLI) делает то же без долгой блокировки: создаёт копию таблицы, применяет накопленные за время копирования изменения через триггер, и подменяет таблицу коротким ACCESS EXCLUSIVE только на финальный swap — секунды, а не часы. ...

9 сентября 2026 г. · llexa

Habr Article Downloader: статьи в Markdown, без нагрузки на сервер

Habr Article Downloader сохраняет статьи Хабра в Markdown для офлайн-чтения — с YAML-заголовком (рейтинг, хабы, теги, автор, дата) и HTML→Markdown через Turndown. Четыре режима: одна статья, пакет ссылок, слежение за лентой, фильтры по критериям. Интереснее не сама выгрузка, а как расширение не кладёт чужой сервер: пауза 1.5 секунды между запросами (rate limiting), а поверх — circuit breaker: получив HTTP 429, инструмент не повторяет запрос сразу, а останавливается на 3 минуты целиком, вместо того чтобы долбить сервер той же паузой дальше. ...

9 сентября 2026 г. · llexa

fail2ban: банит по логам, а не ждёт руками

SSH на публичном IP получает перебор паролей с первых минут после старта — fail2ban читает логи (/var/log/auth.log, journald) через filter, находит совпадения по regex и банит IP через iptables/nftables/firewalld на время bantime. jail.local — конфиг поверх дефолтов (jail.conf не трогать, апдейты пакета его перезапишут): [sshd] enabled = true, maxretry = 3 — попыток до бана, findtime = 10m — окно, в котором они считаются, bantime = 1h — срок бана (-1 — навсегда). ...

8 сентября 2026 г. · llexa

iostat и sar: диск и CPU за интервал, не мгновенный снимок

top/vmstat без параметров показывают текущий момент — iostat и sar (пакет sysstat) считают статистику за интервал и показывают тренд: iostat -x 2 5 — расширенный вывод каждые 2 секунды, 5 раз, с %util (загрузка диска) и await (время ожидания I/O). sar идёт дальше — если sysstat настроен таймером (сбор каждые 10 минут), он копит историю в /var/log/sa/, и sar -u -f /var/log/sa/sa15 покажет загрузку CPU за 15-е число без настройки мониторинга заранее — спасает при разборе уже закончившегося инцидента. ...

8 сентября 2026 г. · llexa

Proxmox #9: встроенный firewall — datacenter, host и VM

Firewall в Proxmox VE не отдельный демон — надстройка над iptables/nftables хоста с тремя уровнями: Datacenter (общие правила для всего кластера), Host (конкретный узел) и VM/CT (конкретная виртуалка). Правила нижнего уровня наследуют верхние, но могут их сузить. Security groups — именованные наборы правил на несколько VM сразу: удобно для одинаковых веб-серверов без дублирования. Alias — имя вместо IP/подсети, чтобы не переписывать адреса при их смене. Включается на каждом уровне отдельным чекбоксом Firewall: Enabled — по умолчанию выключен даже после настройки правил, забытый чекбокс на уровне VM самая частая причина «правила есть, а не работают». Конфиг хранится в /etc/pve/firewall/ и /etc/pve/nodes/<node>/host.fw, синхронизируется через pmxcfs. ...

7 сентября 2026 г. · llexa

Архиваторы #7: squashfs — сжатый read-only образ ФС

В отличие от zstd/xz/lz4 из прошлых выпусков, squashfs — не формат архива, а сжатая файловая система: mksquashfs dir/ image.squashfs -comp zstd собирает целое дерево файлов в один read-only образ, который монтируется напрямую (mount -t squashfs image.squashfs /mnt) без распаковки. Именно так устроены live-образы дистрибутивов и слои Docker/OverlayFS — сжатие в разы экономит место, а доступ на чтение почти не отличается от обычной ФС благодаря постраничному разжатию на лету. unsquashfs -l image.squashfs покажет список файлов без монтирования, -d dir распакует всё целиком, если нужен полный доступ на запись. ...

7 сентября 2026 г. · llexa

IT-мем: 2038 — второй Y2K уже назначен

32-битный time_t считает секунды с 1 января 1970 — и переполнится 19 января 2038 года в 03:14:07 UTC, уйдя в отрицательные числа. Для систем, которые всё ещё хранят время как signed 32-bit int, это будет означать резкий прыжок в 1901 год. Большинство современных дистрибутивов давно перешли на 64-битный time_t (glibc 2.34+, ядро с поддержкой 64-bit time), но встроенные системы, старые файловые форматы с 32-битными timestamp и legacy-софт с захардкоженным int32 под датой — не переживут переход тихо. ...

6 сентября 2026 г. · llexa