Современные ФС #2: btrfs — сабволюмы и снапшоты

Сабволюм — независимое дерево внутри одной btrfs-файловой системы, со своими снапшотами и квотами: btrfs subvolume create /mnt/data/@home btrfs subvolume list /mnt/data Монтировать конкретный сабволюм, а не весь раздел, через /etc/fstab: # /etc/fstab UUID=... /home btrfs subvol=@home,compress=zstd 0 0 Снапшот сабволюма создаётся мгновенно — это CoW-ссылка, а не копия данных: btrfs subvolume snapshot /mnt/data/@home /mnt/data/@home_snap_$(date +%F) Откат — переименовать текущий сабволюм и подставить снапшот на его место: mv /mnt/data/@home /mnt/data/@home_broken btrfs subvolume snapshot /mnt/data/@home_snap /mnt/data/@home Удалить сабволюм, когда снапшот больше не нужен: ...

24 июня 2026 г. · llexa

cut / paste / join: обработка табличных данных без awk

cut достаёт нужные поля по разделителю — для /etc/passwd это имя пользователя и шелл: cut -d: -f1,7 /etc/passwd paste склеивает строки из разных файлов в колонки — удобно собрать CSV из нескольких списков: paste -d, names.txt emails.txt > users.csv join делает то же, что JOIN в SQL — слияние двух файлов по общему полю-ключу. Оба файла должны быть отсортированы по этому полю: sort -k1,1 file1.txt -o file1.txt sort -k1,1 file2.txt -o file2.txt join file1.txt file2.txt Эта тройка закрывает большинство задач по табличным данным в shell без необходимости каждый раз писать awk-скрипт. ...

23 июня 2026 г. · llexa

gpg: шифрование и подписи без облака

Пара ключей создаётся одной командой, дальше gpg сам спрашивает имя, email и пароль: gpg --gen-key gpg --list-keys Зашифровать файл для конкретного получателя — по его публичному ключу: gpg -e -r user@example.com file.txt gpg -e -r user@example.com --armor file.txt # текстовый вывод вместо бинарного Расшифровка — gpg сам найдёт нужный приватный ключ в keyring и спросит пароль: gpg -d file.txt.gpg > file.txt Подпись подтверждает авторство без шифрования содержимого: gpg --sign file.txt gpg --verify file.txt.gpg Публичный ключ для обмена — экспорт и импорт в текстовом виде: ...

23 июня 2026 г. · llexa

timeout: защита от зависших команд

Если команда может зависнуть навсегда — timeout убивает её по таймауту: timeout 5s curl https://example.com По умолчанию посылается SIGTERM, но не все процессы его слушают. --kill-after добивает SIGKILL, если процесс не завершился сам: timeout --kill-after=3s 10s ./stuck-script.sh Код возврата 124 — сигнал о том, что сработал именно таймаут, а не ошибка самой команды: timeout 5s long-task; echo $? # 124 = превышен лимит В cron-задачах timeout — стандартная страховка от зависшего скрипта, который иначе будет копиться в процессах до следующего перезапуска: ...

23 июня 2026 г. · llexa

/proc — файловая система, которой нет на диске

/proc существует только в памяти — ядро генерирует содержимое файлов при каждом чтении, на диске ничего не лежит. grep MemAvailable /proc/meminfo cat /proc/cpuinfo | grep "model name" | head -1 Для конкретного процесса — каталог /proc/<pid>/: cmdline хранит аргументы запуска через нулевые байты вместо пробелов, поэтому читать его лучше через tr: cat /proc/1234/cmdline | tr '\0' ' ' /proc/net/tcp отдаёт таблицу соединений в сыром виде — адреса и порты в hex, состояние сокета числом. На этот файл, собственно, и опирается ss. ...

22 июня 2026 г. · llexa

bash: process substitution — <() и >()

<(cmd) превращает вывод команды в путь к файлу — bash создаёт /dev/fd/N, и его можно подсунуть туда, где ожидается файл, а не stdin. diff <(ssh host1 cat /etc/hosts) <(ssh host2 cat /etc/hosts) Без процесс-сабституции пришлось бы гонять вывод во временные файлы и чистить их после. Здесь diff получает два «файла», которые на самом деле читают из живых SSH-сессий параллельно. >(cmd) — обратная операция: команда справа получает на вход поток, который записывается слева. ...

22 июня 2026 г. · llexa

cgroups v2: лимиты CPU и RAM на сервис

systemd-cgls показывает дерево cgroup — какие процессы в каком слайсе сидят, без похода в /sys/fs/cgroup/ руками. systemd-cgls systemd-cgtop Лимит для конкретного сервиса ставится одной командой, без правки unit-файла: systemctl set-property nginx.service CPUQuota=50% MemoryMax=512M Изменения применяются сразу и переживают перезапуск сервиса — systemd пишет их в /etc/systemd/system.control/. Текущие значения видны прямо в файловой системе cgroup: cat /sys/fs/cgroup/system.slice/nginx.service/cpu.max cat /sys/fs/cgroup/system.slice/nginx.service/memory.max Если сервис выходит за MemoryMax — ядро убивает его через OOM killer внутри cgroup, не трогая остальную систему. ...

22 июня 2026 г. · llexa

Эволюция пароля от root за 10 лет

2016: password 2017: P@ssw0rd1 2018: Company2018! 2020: меняется каждый квартал, в конце дописывается !! 2022: password manager + сложность 32 символа, никто его не знает 2024: SSO + passkey, пароля как такового уже нет 2026: и всё равно кто-то находит .env в публичном репо #юмор #sysadmin #security

21 июня 2026 г. · llexa

vmsync: инкрементальная репликация libvirt VM

vmsync копирует диски libvirt-машины на удалённый хост без полной пересылки при каждом запуске. После первой полной синхронизации он следит за изменёнными блоками через dirty bitmap QEMU и гонит дальше только дельту. vmsync -source-domain myvm -source-uri qemu:///system \ -target-uri qemu+ssh://backup-host/system Первый прогон тащит весь qcow2-диск через NBD, все последующие — только блоки, изменившиеся с момента последнего bitmap-чекпоинта. Лёгкая альтернатива shared storage там, где полноценный кластер не нужен, а гонять rsync всего диска каждый раз — слишком долго. ...

20 июня 2026 г. · llexa

xargs: параллельность и тонкая настройка

xargs -P 4 запускает до 4 процессов параллельно вместо обработки файлов один за другим. find /var/log -name "*.log" -print0 | xargs -0 -P 4 -I {} gzip {} -print0 у find и -0 у xargs — пара для имён с пробелами и переводами строк: find разделяет вывод нулевым байтом вместо пробела, xargs так же его читает. Без этой пары имя файла с пробелом превратится в два отдельных аргумента. -I {} подставляет каждый аргумент в шаблон команды. Если нужно ограничить число аргументов на один вызов — --max-args=2, полезно для команд, которые не умеют принимать длинный список сразу. ...

20 июня 2026 г. · llexa