LaurVas

Ускоряем установку пакетов в Debian (libeatmydata)

   linux debian

Установкой пакетов в Debian занимается… нет, не apt. Apt только скачивает пакеты из репозитория, а установкой занимается dpkg. Если вы интересовались разными linux-дистрибутивами, то могли заметить, что dpkg работает медленно, особенно в сравнении с pacman из Archlinux. Тому есть несколько причин, и одна из них — dpkg ну очень осторожно пишет на диск: на каждый чих дёргает системный вызов fsync, который заставляет ОС сбросить на диск данные, ожидающие своей очереди в кэше. И пока ОС не убедится в том что данные записаны, dpkg будет бездействовать. Но не спешите критиковать разработчиков. Так сделано из благих намерений, чтобы данные не потерялись в случае внезапной потери питания. База данных dpkg — дико хрупкая штука, её невозможно восстановить автоматически.

Бывает так, что скорость установки пакетов важнее устойчивости к сбоям. Как ускорить dpkg? Часть дисковых синхронизаций отключается ключом --force-unsafe-io или аналогичной опцией в конфиге dpkg. Можно пойти ещё дальше и позвать на помощь библиотеку libeatmydata, которая напрочь отшибает всю осторожность. Жизнь слишком коротка чтобы делать fsync!

Библиотека libeatmydata делает одну единственную вещь: перехватывает системный вызов fsync и тут же возвращает управление назад. Это приводит к тому, что:

  • программа, которая осторожно пишет на диск (база данных), начинает работать гораздо быстрее.
  • падение такой программы может привести к потере данных.

В этой статье я покажу как использовать libeatmydata и устрою бенчмарк (спойлер: ускорение до 14 раз). Кстати, этот способ подойдёт не только для установки пакетов, но и для любой БД.

Строгий календарь 2019

   дизайн

Скачать в pdf: версия на одном и на двух листах (по 6 месяцев).

Каледнарь предназначен для печати на форматах от А4 до А2, поэтому в самом документе поля отсутствуют. При печати указывайте в параметрах что-то вроде “масштабировать под размер области печати”, чтобы края не пропали.

В распечатанном календаре надо подписать все важные дни (для этого отведено место справа от даты) и повесить его на видном месте.

Под катом — почему он такой.

Оконный менеджер i3

   linux

Иногда в Openbox’е мне не хватало тайлинга: чтобы окна не перекрывали друг друга, а стыковались:

 

Разумеется, можно расставить их так руками. Но стоит открыть лишь ещё один терминал, и весь порядок рушится. Да, в типовых ситуациях выручали горячие клавиши. Но на все комбинации окон не напасёшься горячих клавиш. А ещё я перфекционист и заморачиваюсь по поводу рационального использования площади монитора. Я отключал заголовки окон и радовался выигранному пространству:

i3 подарил мне неожиданный прирост эффективности и стал одним из моих любимых инструментов. Почему я так тащусь от него?

  • Окна всегда занимают всю площадь экрана.
  • Окна не перекрывают друг друга.
  • В i3 я спокойно ориентируюсь в 20 открытых окнах. Раньше путался уже на 10.
  • Всё управление окнами осуществляется с клавиатуры.
  • Есть в нём какая-то неуловимая красота.

К тайловому оконному менеджеру (сокращённо WM) надо привыкнуть. Это нормально. Linux тоже поначалу был непривычен, верно? Запаситесь терпением, и оно окупится.

Строгий календарь 2018

   дизайн

Ключевые особенности моего календаря:

  • без отвлекающих картинок
  • максимально используется доступная площадь
  • месяцы идут подряд один за другим
  • нерабочие дни хорошо видно
  • месяцы пронумерованы

В этот раз взял шрифт Roboto Sans. В отличие от 2017 года, в 2018-ом разное количество недель в первом и втором полугодии. Из-за этого календарь получился не таким геометрически строгим, как прошлый раз.

Скачать в pdf: версия на одном и на двух листах (6+6).

Каледнарь предназначен для печати на форматах от А4 до А2, поэтому в самом документе поля отсутствуют. При печати указывайте в параметрах что-то вроде “масштабировать под размер области печати”, чтобы края не пропали.

В распечатанном календаре надо подписать все важные даты (для этого отведено место справа от даты) и повесить его на видном месте.

Мой лончер на базе Dmenu

   bash

Dmenu — это простая, но очень полезная деталь лего утилита. Она читает список из стандартного ввода (stdin) и отображает его на экране в виде вертикального (ключ -l) или горизонтального списка. Пользователь может выбрать один из пунктов стрелками на клавиатуре или печатая символы. Выбранный пункт направляется в стандартный вывод (stdout).

В стандартной поставке вместе с dmenu идёт скрипт dmenu_run для запуска приложений. Ему на вход ничего подавать не надо, он сам возьмёт все бинари из PATH и поместит их в список dmenu, после чего запустит выбранную программу.

Я придумал более удобный скрипт для запуска приложений.

Как случайно не выключить сервер по ssh

   linux bash

Однажды я набрал sudo poweroff не в той консоли и погасил какой-то сервер вместо домашнего компьютера. После этого я задумался, что неплохо было бы иметь защитный механизм от невнимательности. Возникла идея простой проверки: если poweroff или reboot был запущен по ssh, то предупредить пользователя что он собирается выключить/перезагрузить сервер и потребовать подтверждение.

Получился маленький скрипт:

/usr/local/sbin/poweroff
#!/bin/bash

action=$(basename $0)
if [[ -n "$SSH_CLIENT" || -n "$SSH2_CLIENT" ]]; then
  read -p "You are going to $action $(hostname) over ssh. Are you sure (y/N)? " -r
  if [[ $REPLY =~ ^[Yy]$ ]]; then
    /sbin/$action
  fi
else
  /sbin/$action
fi

Делаем загрузочный образ из контейнера

   debian linux

Пользовался я контейнерами и бед не знал. Но вот понадобилось как-то собрать пакет openjdk-6. А он при сборке ругается на ядро: uname -a ему не нравится. Говорит не буду такое поддерживать. Значит надо собирать на железе или виртуалке. Устанавливать систему с нуля не хотелось — слишком долго. И тогда я подумал, что можно развернуть бэкап контейнера на диск, добавить загрузчик и ядро и получить Debian, способный работать самостоятельно. А чтобы не выполнять одну и ту же работу дважды, я решил работать не на диске, а в образе, и сохранить его на будущее.

Эта инструкция подойдёт для всех релизов Debian и Ubuntu. Я буду переносить Debian Jessie.

Использование утилиты debootstrap

   debian

Debootstrap — это первый шаг в ручной установке Debian и при подготовке линукс-контейнера на основе Debian или Ubuntu. Благодаря ему в пустом каталоге зарождается жизнь.

Чтобы не повторять одно и то же в трёх местах, я вынес этот шаг в отдельный пост.

Запускаем Debian в chroot-окружении

   chroot debian

Chroot-окружение — это самый доступный способ запустить линукс внутри линукса (т.н. контейнер). Внутренняя система будет изолирована от основной только на уровне корневой файловой системы (rootfs). Сетевой стэк, псевдо-файловые системы /proc, /sys, /dev будут общими для хоста и контейнера. Поэтому не стоит считать chroot-окружение достаточной мерой для изоляции опасных/недоверенных приложений. Для этого больше подходит systemd-nspawn.

Основные риски:

  • Из chroot-окружения можно убивать процессы хоста.
  • Система из chroot-окружения имеет доступ к дисковым устройствам. Являясь рутом в контейнере, можно примонтировать блочное устройство хоста (какой-нибудь /dev/sda1) и читать оттуда информацию. Или затереть к чёрту.

Если chroot так несовершенен, то зачем он нужен сегодня?

Не всё работает должным образом в systemd-nspawn контейнере. Нельзя натянуть файл на петлевое устройство (loop device). Нельзя запустить ещё один контейнер (линукс внутри линукса внутри линукса), а в чруте можно. Это нужно, например, для сборки livecd.

Не везде есть systemd. Таких дистрибутивов почти не осталось. Это либо что-то старое, либо Gentoo.

Далее описано создание и использование контейнера с Debian-based системой (Debian, Ubuntu, Kali). Выполняемые действия те же, что и при создании/использовании systemd-nspawn контейнера, но есть небольшие отличия.