OpenBSD на рабочей станции

Материал из OpenBSD-Wiki
Перейти к навигации Перейти к поиску
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Вольный перевод статьи Eric Radman An OpenBSD Workstation с некоторыми дополнениями учитывающими изменения пришедшие в свежих релизах.

Выключение системы нажатием на кнопку питания

Безопасное выключение компьютера нажатием на кнопку питания возможно после передачи ядру параметра:

# /etc/sysctl.conf
hw.allowpowerdown=1

Параметр может быть установлен только до перехода системы к уровню безопасности 1, подробнее в securelevel(7).

Больше никаких раздражающих сигналов

Одна из многих вещей, которую узнаешь прочитав Absolute OpenBSD - это как отключить раздражающий сигнал:

# /etc/wsconsctl.conf
keyboard.bell.volume=0

Начиная с релиза 5.4 способ с wsconsctl больше не работает. Отключить сигнал можно так:

# ~/.xinitrc
xset -b

или

# /etc/rc.conf.local
mixerctl inputs.spkr.mute=on

Монтирование съемных устройств пользователем

Удобно, когда можно смонтировать DVD или флеш-носитель без повышения привилегий, используя для этого членство в группе operator.

# usermod -G operator eradman
# chmod g=rw /dev/cd0*

Остаётся изменить параметр ядра и можно пользоваться.

# sysctl kern.usermount=1
$ mkdir -p mount/cdrom
$ mount /dev/cd0c mount/cdrom

Suspend & Resume

OpenBSD обладает хорошей поддержкой ACPI, подробнее в apmd(8). zzz и ZZZ быстрый способ перехода в режимы suspend и hibernate, если apmd запускается при загрузке.

# rc.conf.local
apmd_flags="-A"

"-A" будет автоматически масштабировать частоту CPU для оптимального энергопотребления.

Начиная с выпуска 5.6, управление сервисами осуществляется посредством утилиты rcctl(8).

# rcctl getdef apmd        
apmd_flags=NO
…
# rcctl enable apmd
…
# rcctl getdef apmd        
apmd_flags=

X Configuration: .xinitrc

# ~/.xinitrc

redshift -O 5600

while true; do
    batt="$(sysctl -n hw.sensors.acpibat0.watthour3 | cut -f1,2 -d" ")"
    xsetroot -name "$batt"
    sleep 60
done &
xsetroot -solid steelblue  &
exec dwm

redshift утилита предназначена для регулировки цветовой температуры экрана в зависимости от вашего окружения. Это работает и в случае ручной регулировки цветовой температуры. Например, подсветка экрана IBM T60p автора статьи по умолчанию "холодная", поэтому он изменяет значение цветовую температуры с 6500K до 5600K.

Запускаем циклический опрос сенсора времени жизни батареи (battery life (Wh)) с интервалом один раз в 60 сек, а полученное значение выводим "поверх" корневого окна.

Установим цвет фона и запустить свой любимый менеджер окон.

Переключение на внешний монитор

Разрешение дисплея на рабочем месте немного выше чем дисплея ноутбука, небольшой скрипт для переключения на внешний монитор:

#!/bin/sh
xrandr --output LVDS --off
xrandr --output VGA-0 --off
xrandr --output DVI-0 --auto
redshift -O 6200

По моему опыту, X11 иногда скрывает курсор мыши, если возобновление работы системы происходило при подключенном внешнем мониторе. Для решения я использовал unclutter - утилиту скрывающую курсор мыши когда он неподвижен и восстанавливающую его как только он переместился.

pkill unclutter
unclutter -idle 1 -root -grab -visible &

Лично мне больше нравится немного другой вариант:

xrandr --query | grep "VGA1 connected" && xrandr --output LVDS1 --off --output VGA1 --mode 1920x1080

Подключение проектора

Если X-сервер запускается когда проектор подключен к VGA порту, то скорее всего сервер установит для встроенного и внешнего дисплеев одинаковое разрешение. На T60 например, это можно изменить:

xrandr --output LVDS --mode 1400x1050

Используя --query можно узнать какие режимы поддерживаются дисплеем, then I set up a viewport that pans with the mouse pointer

xrandr --output VGA-0 --mode 1024x768 --panning 1400x1050

Так же, я добавил в .xinitrc команды для автоматической конфигурации дисплеев, если при запуске X-сервера внешний монитор уже подключен:

xrandr --query | grep "DVI-0 connected" && ~/bin/docked-dvi
xrandr --query | grep "VGA-0 connected" && ~/bin/docked-vga

tmux - мультиплексор терминалов

Несколько дополнений в мою конфигурацию мультиплексора терминалов. Я часто запускаю entr в небольшой панели снизу.

bind-key C-t split-window -p 25

Не знаю палитры цветов терминала, но её можно распечатать:

#!/bin/ksh

for i in `jot 255`; do
  printf "\033[38;5;${i}mcolour${i}\n"
done

Фон строки состояния и границы активного окна ярко-зеленый:

set -g status-bg colour118
set -g pane-active-border-fg colour118
set -g pane-border-fg colour30

Таблица с сопоставлением клавиатурных комбинаций для tmux и screen

Использование шифрования для дисков

OpenBSD предоставляет программный RAID как виртуальный хост-адаптер шины (HBA). Также HBA применяется для настройки и использования шифрования дисков. Посредством disklabel(8) установим тип раздела RAID (в оригинальной статье автор использует блочное устройство /dev/sd0c как шифрованный том, монтируемый в /home):

$ sudo disklabel -E /dev/sd0c
Label editor (enter '?' for help at any prompt)
  g:         55641600        100653824    RAID
> m g
offset: [100653824]
size: [55641600]
FS type: [4.2BSD] RAID

Для настройки шифрования используем bioctl(8) с параметром -c C:

# bioctl -c C -l /dev/sd0g softraid0
New passphrase: My Crypto Pass Phrase
Re-type passphrase: My Crypto Pass Phrase
softraid0: CRYPTO volume attached as sd1

Монтирование выполняется той же командой, журнал ядра сообщит о появлении нового виртуального устройства:

sd1 at scsibus2 targ 1 lun 0: <OPENBSD, SR CRYPTO, 005> SCSI2 0/direct fixed
sd1: 27168MB, 512 bytes/sector, 55641072 sectors

Разметим и отформатируем шифрованный том:

$ sudo disklabel -E /dev/sd1c
...
$ sudo newfs /dev/rsd1a

Устройства в OpenBSD могут монтироваться по имени или с использованием disklabel UID, который случайным образом генерируется при разметке:

$ disklabel /dev/sd1a | grep uid
duid: 779d87bac3905122

Полученный UID используется для монтирования тома, что позволяет избежать путаницы при. Код ниже, позволит выполнить четыре попытки ввода ключевой фразы для дешифрации тома:

#/etc/rc.local
for attept in 1 2 3 4; do
  bioctl -c C -l c3e2f405c96a8e10.g softraid0 && break
  sleep 1
done
fsck /dev/rsd1a
mount -o nodev,nosuid,softdep 779d87bac3905122.a /home

Если необходим полностью шифрованный загрузочный том, ознакомьтесь с публикацией Ted Unangst.

Уменьшим "возню" с паролями с помощью YubiKey

Yubico выпускают небольшие аппаратные ключи, которые используются для авторизации с использованием одноразовых паролей (OTP). Yubikey-personalization-gui - это QT-приложение, которое может быть использовано для записи приватных ключей в один из двух слотов. Запишите без пробелов 6-байт в файл приватной? идентификации и 16-байт в файл ключа:

echo "5c e1 e0 3e 63 a4" \
        | tr -d ' ' > /var/db/yubikey/$USER.id
echo "57 e3 af 3e 9b 51 2b 10 58 7d 33 fb d9 08 ef 7b" \
        | tr -d ' ' > /var/db/yubikey/$USER.key
chmod 600 /var/db/yubikey/$USER.*

Настроим YubiKey в качестве метода локальной авторизации и авторизации через SSH.

# Default allowed authentication styles
auth-defaults:auth=yubikey,passwd,skey:

Перестроим БД авторизации - login.conf

cap_mkdb /etc/login.conf

Для уменьшения количества вводимых символов, второй слот YubiKey используется как относительно безопасный метод активации ssh-agent, что позволяет соединяться с удалёнными системами, на которых уже присутствует мой публичный ключ (RSA, DSA, ECDSA). Для этого, используя yubikey-personalization-gui создайте случайный ключ, а затем установите слот 2 в режим "запрос-ответ" (challеnge-response):

hexkey=$(echo "dd b6 68 81 c9 73 f9 64 84 21 7e f0 69 e8 2c 28 1b 6c ad e2" | tr -d ' ')
ykpersonalize -2 -ochal-resp -ochal-hmac -ohmac-lt64 -a $hexkey

Затем создайте новую пару SSH-ключей с помощью ответов ykchalresp. Скрипт ykauth, установлен в ~/bin.

#!/bin/sh
ykchalresp -2 "$(whoami)@$(hostname)" | cut -c 1-15

И наконец, настроим автоматическую активацию ключей при входе в систему:

ssh-add -l > /dev/null 2>&1 || {
    eval `ssh-agent`
    DISPLAY='' SSH_ASKPASS='/home/eradman/bin/ykauth' ssh-add < /dev/null
    exec ksh
}

Настройка производительности

Нет документов описывающих способы адаптации OpenBSD для рабочей станции. Я делаю следующие изменения. Первое, позволяю приложениям использовать больше оперативной памяти:

# /etc/login.conf
staff:\
        :datasize-cur=2048M:\
        :datasize-max=2048M:\
        :datasize=2048M:\
        :openfiles-cur=1024:\
        :stacksize-cur=16M:\

Если знаете другие способы улучшить производительность, пожалуйста сообщите их автору.

Блокировка экрана

Для автоматической блокировки экрана после 5 минут неактивности, добавьте указанный ниже код в ~/.xinitrc:

xidle -timeout 300 -program "/usr/X11R6/bin/xlock -mode blank" &

Чтобы это сработало когда система переходит в режим сна (suspended), необходимо в /etc/apm/suspend добавить сигнал xidle для запуска программы блокировки.

#!/bin/sh
pkill -USR1 xidle

Смена сетевого подключения

Переключение из одной сети в другую, например из беспроводной в проводную, не является очевидным в BSD.

Во-первых, необходимо остановить dhcp-клиент, чтобы исключить попытки повторной активации сетевого интерфейса:

pkill dhclient

Затем удалить установленный IP-адрес и деактивировать сетевой интерфейс:

ifconfig wpi0 -inet down

Удаление IP-адреса так же сбрасывает локальные маршруты. Сбросить все прочие маршруты:

route -n flush

-n предотвращает попытки route пытаться разрешать имена хостов.

Если для подключения к беспроводной сети использовался WPA, следует удалить параметры подключения к сети, чтобы получать широковещательные SSID других сетей:

ifconfig wpi0 nwid "Mobile Hotspot" wpa wpakey 09123456789
ifconfig wpi0 -nwid -wpa -wpakey # use broadcast id