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

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

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

Архиваторы #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

FUSE с нуля #2: монтируем облако через rclone

В прошлом выпуске серии sshfs показал главную идею FUSE — файловая система в userspace без единой строчки кода ядра. rclone расширяет это на облако: 40+ бэкендов (S3, Google Drive, WebDAV, Backblaze и т.д.) через один и тот же FUSE-интерфейс. # примонтировать заранее настроенный rclone remote rclone mount remote:bucket /mnt/cloud --daemon # с кэшем на чтение — критично для WebDAV/GDrive, где листинг медленный rclone mount remote:bucket /mnt/cloud --vfs-cache-mode writes --daemon # отмонтировать fusermount -u /mnt/cloud После монтирования каталог ведёт себя как обычная ФС — cp, ls, tail -f работают без клиента. Разница с sshfs: под капотом не SSH-сессия, а HTTP API облака, и --vfs-cache-mode решает, что кэшировать локально. ...

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

Обзор новинок #8: 27 августа — 3 сентября

Новые релизы за неделю — только то, что важно для сервера. vscode 1.136.0 nginx 1.31.5 — control API, predicate locations, ngx_http-модуль grafana v12.4.10 homepage v2.2.0 doggo v1.4.0 — bind резолверы к исходному адресу через -b keycloak 26.7.3 — фикс CVE-2026-35563 в LDAP-клиенте sing-box v1.14.0 loki v3.6.16 — флаг игнорировать пропавшие чанки при удалении логов immich v3.2.0-rc.0 bottom 0.14.9 — опция показывать нулевой сетевой трафик при старте #linux #sysadmin #releases

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

rsyslog: классический syslog жив и настраивается

journald пишет бинарный журнал локально, но текстовые файлы в /var/log и отправку логов на другой сервер до сих пор делает rsyslog — на Debian он стоит рядом с journald по умолчанию. # /etc/rsyslog.d/10-app.conf if $programname == 'myapp' then /var/log/myapp.log & stop *.emerg :omusrmsg:* mail.* -/var/log/mail.log Фильтр строится по facility.severity или по имени программы. & stop после правила — не отдавать сообщение дальше, иначе строка попадёт ещё и в общий syslog. *.* @logserver.local:514 # UDP *.* @@logserver.local:514 # TCP — надёжнее при нестабильной сети systemctl restart rsyslog logger -p mail.info "test message" # проверить правило без ожидания реального события #linux #logging

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

shellcheck: линтер для bash-скриптов, которые все пишут на глаз

Bash-скрипт для деплоя обычно пишется быстро и без ревью. shellcheck находит классические ошибки ещё до запуска. apt install shellcheck shellcheck deploy.sh deploy.sh:12:5: warning: Double quote to prevent globbing and word splitting [SC2086] deploy.sh:20:1: warning: This command doesn't exit, but sourced or eval'd files may have set -e [SC2317] Типичные находки: $VAR без кавычек в пути с пробелами, [ $a == $b ] вместо [ "$a" = "$b" ], забытая проверка $?. Каждое предупреждение — с кодом SCxxxx и ссылкой на объяснение. ...

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

udev: почему флешка каждый раз /dev/sdb, и как это исправить

Имя /dev/sdb — не гарантия: порядок инициализации USB-дисков при следующей загрузке может измениться. udev привязывает своё имя к устройству по атрибутам, а не по порядку обнаружения. udevadm info -a -n /dev/sdb # атрибуты устройства udevadm monitor # события подключения в реальном времени # /etc/udev/rules.d/99-backup-disk.rules SUBSYSTEM=="block", ATTRS{serial}=="WD-WCC4E1234567", SYMLINK+="backup-disk", OWNER="backup" Правило матчится по ATTRS{serial} и создаёт ссылку /dev/backup-disk на нужный диск — тот же принцип, что у /dev/disk/by-uuid/. udevadm control --reload-rules udevadm trigger --attr-match=subsystem=block # применить без переподключения #linux #systemd

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