LaurVas

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

дизайн

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

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

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

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

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

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

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

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

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

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

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

linux

Однажды я набрал 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-окружении

debian, linux

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 контейнера, но есть небольшие отличия.

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

дизайн

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

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

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

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

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

Запускаем Debian в контейнере systemd-nspawn

debian, linux

Linux-контейнер — это линукс внутри линукса. Примерно как виртуализация (VirtualBox, Qemu), только без эмуляции железа. Для каких задач могут пригодиться контейнеры?

  • Когда хочется установить временно какой-то софт, не захлямляя основную ОС. Сделал контейнер, поработал, сохранил результат, удалил контейнер. Мусора в системе не осталось.

  • Когда нужна более свежая или наоборот, устаревшая версия той или иной программы/библиотеки.

  • Когда нужного софта нет в репозиториях вашего дистрибутива, зато есть в репозиториях другого. Например мне пару раз нужен был pdftk, который в Archlinux есть в AUR, но не хочет собираться. Я нашёл готовый пакет в Debian и быстро установил его в контейнере.

  • Когда надо потестить свежий выпуск Debian/Ubuntu/whatever.

  • Чтобы проверить работоспособность своего скрипта/приложения в другой среде, погонять тесты/бенчмарки.

  • Для сборки пакетов под другой дистрибутив.

  • Когда вам по работе нужен какой-нибудь oldstable Debian, недостойный быть основной системой на компьютере из-за плохой поддержки оборудования.

  • Для изоляции приложений. Заводим отдельный контейнер под Skype и не боимся его шпионских действий.

Эта инструкция описывает создание и использование контейнера на примере Debian Jessie. Создание контейнера с другим Linux-дистрибутивом ничем принципиально не отличается.

Ручная установка минимального Debian-based Linux (Install Debian the Archlinux way)

debian, linux

В данном руководстве описана установка Debian-based дистрибутива Linux (Debian, Ubuntu, Kali и др.) с нуля без использования каких-либо автоматических установщиков.

Цель ручной установки — минимизировать количество пакетов в системе, установить только то, что нужно. В какой-то момент понимаешь, что проще поставить систему с нуля, чем выпиливать лишнее из готовой. Какие преимущества это даёт перед традиционным способом установки?

  • Ручная установка поможет лучше узнать как работает ОС.
  • Экономится дисковое пространство, система занимает меньше места.
  • Обновления системы проходят быстрее, экономится трафик.
  • Бэкап системы занимает меньше места и быстрее разворачивается.
  • Вы знаете что есть в системе и для чего.
  • Загрузка из выключенного состояния проходит быстрее, т.к. не запускаются сервисы, о назначении которых вы ничего не знаете.
  • Поскольку лишних сервисов нет, ресурсы компьютера используются более рационально.

Trap в Bash — обработка сигналов и ошибок

bash

Использование

trap ДЕЙСТВИЕ СИГНАЛ...

Trap работает довольно просто — при возникновении сигнала будет выполнено указанное действие. Если действие простое (цепочка команд, умещающаяся на одной строке), его можно указать прямо в аргументе trap. Если не очень простое, то надо объявить функцию и поместить вызов этой функции в trap.

Можно обрабатывать стандартные сигналы из signal.h. Их полный список выводится по trap -l. Также доступны специфические для Bash: DEBUG, RETURN, ERR, EXIT.

На практике trap оказывается не такой уж простой штукой. Иногда он не срабатывает, хотя вроде бы должен.