пятница, 16 марта 2012 г.

Перенос lvm тома

Перенос lvm тома
Появился новый жесткий диск, решил перенести на него всю систему.
Старый диск:
/dev/sdb1 - ext4, на нём корень
/dev/sdb2 - lvm, там /usr, /var, swap и шифрованный /home.

Все действия осуществляю, загрузившись с liveusb SystemRescueCD.

На новом диске создаю соответствующее разбиение.

Перенос раздела с ext4 (/dev/sdb1 -> /dev/sda1) делается просто:
# partclone -b -s /dev/sdb1 -O /dev/sda1
Переходим к lvm.

Форматируем раздел под lvm:
# pvcreate /dev/sda2
Растягиваем имеющуюся группу томов на оба раздела (старый и новый), до запуска команды в vg1 только один раздел
# vgextend vg1 /dev/sda2
Переносим непосредственно данные:
# pvmove /dev/sdb2 /dev/sda2
Удаляем из группы vg1 старый том:
# vgreduce vg1 /dev/sdb2
Готово. Только не забыть установить загрузчик на новый диск, и можно удалять старый.

суббота, 10 марта 2012 г.

Сделать фото вебкамерой из консоли

Простой способ сделать фото с подключенной вебкамеры (например для использования в скриптах):
mplayer -vo png -frames 1 tv://
Моя камера, видимо, не успевает до конца инициализироваться, поэтому вместо фото я получаю зеленый прямоугольник. Достаточным оказалось поставить параметр -frames 2, после чего первый кадр просто удаляю.

среда, 8 февраля 2012 г.

Модули virtualbox и ошибка Unknown symbol pv_irq_ops pv_lock_ops

Если попытка подгрузить модули VirtualBox ругается таким образом:
FATAL: Error inserting vboxdrv (/lib/modules/3.2.1-gentoo-r2/misc/vboxdrv.ko): Unknown symbol in module, or unknown parameter (see dmesg)
А в /var/log/messages сообщается следующее:
Feb  8 16:26:58 gentoobook kernel: vboxdrv: Unknown symbol pv_irq_ops (err 0)
Feb  8 16:26:58 gentoobook kernel: vboxdrv: Unknown symbol pv_lock_ops (err 0)
То нужно в ядре включить опцию CONFIG_UNUSED_SYMBOLS.

понедельник, 30 января 2012 г.

Шифрование домашнего каталога

Миграция на шифрованный раздел.

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

Было:
+----------------------------------------------------+
|                  Disk /dev/sda                     |
| +-------+---------------------------------------+  |
| | sda1  | sda2     lvm                          |  |
| |       | +------+------+------+--------------+ |  |
| |  /    | | /usr | /var | swap | /home        | |  |
| |       | +------+------+------+--------------+ |  |
| +-------+---------------------------------------+  |
|                                                    |
+----------------------------------------------------+

Стало:
+----------------------------------------------------+
|                  Disk /dev/sda                     |
| +-------+---------------------------------------+  |
| | sda1  | sda2     lvm                          |  |
| |       | +------+------+------+--------------+ |  |
| |  /    | | /usr | /var | swap | luks         | |  |
| |       | |      |      |      | +----------+ | |  |
| |       | |      |      |      | | /home    | | |  |
| |       | |      |      |      | +----------+ | |  |
| |       | +------+------+------+--------------+ |  |
| +-------+---------------------------------------+  |
|                                                    |
+----------------------------------------------------+
* Кстати, схема-то упрощенная. У lvm не обозначена еще volume group :) *

Для этого мне понадобилось:

Включить в ядре опции:
 Cryptographic API -> SHA224 and SHA256 digest algorithm (CONFIG_CRYPTO_SHA256)
и
Device Drivers -> 
Multiple devices driver support (RAID and LVM) ->
Device mapper support ->
Crypt target support (CONFIG_DM_CRYPT)
Далее я пересобрал ядро и установил пакет cryptosetup.

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

На домашнем разделе занято всего ~50 гигабайт.

Значит уменьшаю home до 60 гигабайт, создаю новый том lvm и шифрую его:
# lvresize -r -L60G /dev/mapper/vg-home

# lvcreate -n hm -l 51734 vg

# cryptosetup luksFormat /dev/mapper/vg-hm
Пароль в последнем шаге должен совпадать с паролем пользователя, т.к. пароль автоматически передается во время входа в систему.

Создаю на новом домашнем разделе файловую систему и переношу туда данные со старого раздела
# cryptsetup luksOpen /dev/mapper/vg-hm secret
# mkfs.ext4 /dev/mapper/secret
# mkdir /mnt/temp
# mount /dev/mapper/vg-hm /mnt/temp
# cp -r /home/* /mnt/temp
# umount /mnt/temp
Теперь устанавливаю pam_mount. У этого пакета необходимо включить USE-флаг crypt.

Добавляю в /etc/pam.d/system-auth строчки (выделены):
auth            required        pam_env.so 
auth            required        pam_unix.so try_first_pass likeauth nullok 
auth            optional        pam_permit.so
auth            optional        pam_mount.so

account         required        pam_unix.so 
account         optional        pam_permit.so

password        required        pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3 
password        required        pam_unix.so try_first_pass use_authtok nullok sha512 shadow 
password        optional        pam_permit.so
  
session         required        pam_limits.so 
session         required        pam_env.so 
session         required        pam_unix.so 
session         optional        pam_permit.so
session         optional        pam_mount.so
А в /etc/security/pam_mount.conf.xml следующее:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE pam_mount SYSTEM "pam_mount.conf.xml.dtd">
<!--
        See pam_mount.conf(5) for a description.
-->

<pam_mount>

                <!-- debug should come before everything else,
                since this file is still processed in a single pass
                from top-to-bottom -->

<debug enable="0" />

                <!-- Volume definitions -->
<volume user="yuri" path="/dev/mapper/vg-hm" mountpoint="~" cipher="aes-cbc-essiv:sha256" />

                <!-- pam_mount parameters: General tunables -->

<!--
<luserconf name=".pam_mount.conf.xml" />
-->

<!-- Note that commenting out mntoptions will give you the defaults.
     You will need to explicitly initialize it with the empty string
     to reset the defaults to nothing. -->
<mntoptions allow="nosuid,nodev,loop,encryption,nonempty,allow_root,allow_other" />
<!--
<mntoptions deny="suid,dev" />
<mntoptions allow="*" />
<mntoptions deny="*" />
-->
<mntoptions require="nosuid,nodev" />

<!-- requires ofl from hxtools to be present -->
<logout wait="0" hup="0" term="0" kill="0" />


                <!-- pam_mount parameters: Volume-related -->

<mkmountpoint enable="1" remove="true" />

</pam_mount>
И не забыть убрать строчку с home из /etc/fstab.

среда, 16 ноября 2011 г.

Сохранение правил iptables в Fedora 16

Netfilter, внутриядерный межсетевой экран Linux, управляемый утилитой iptables, при перезагрузке, как известно, не сохраняет правила фильтрации самостоятельно. Эта задача на совести сборщиков дистрибутивов. И сколько пользуюсь системами, родственными RedHat, правила всегда сохранялись командой
# service iptables save
Но в Fedora 16 используют этот ненужный systemd, который, как оказалось, не может заменить init-скрипты на 100% процентов. Сотрудник Red Hat (судя по адресу электронной почты) Thomas Woerner сообщил: "Пожалуйста, воспользуйтесь старым init-скриптом, его переместили в /usr/libexec:
/usr/libexec/iptables.init save
Нет никакой возможности добавить функцию save в systemd."

среда, 14 сентября 2011 г.

Компьютер с двумя выходами в интернет

Компьютер с двумя выходами в интернет. На моей рабочей машине две сетевые карты - каждая смотрит в свою сеть. Сети абсолютно независымые друг от друга и в каждой сети есть шлюз с выходом в интернет. Условно назовём их 192.168.1.0/24 и 192.168.2.0/24. Маршрут по умолчанию на моей машине по ряду причин указывает на шлюз первой сети, 192.168.1.1. Однако полномочиями администратора я обладаю только во второй сети. Мне понадобилось пробросить определенный порт до моей машины. На шлюзе это сделать не сложно, однако ответ на пакет, пришедший из интернета на 192.168.2.2 уходит по маршруту по умолчанию на 192.168.1.1, где его, конечно же, не ждут.
Значит нужно заставить ядро отправлять такие пакеты туда же, откуда они и пришли. Нужно добавить новую таблицу маршрутизации (номер и название) в файл /etc/iproute2/rt_tables :
10      T1
И дать в консоли эти две команды:
# ip r a default via 192.168.2.1 table T1
# ip rule add from 192.168.2.2 table T1
Первая добавит правило в новую таблицу, а вторая заставит пакеты, пришедшие на интерфейс второй сети подчиняться этому правилу.

воскресенье, 11 сентября 2011 г.

Проверка заряда батареи из командной строки

Узнать состояние батареи лэптопа можно простой командой acpi из одноименного пакета.
$ acpi
Battery 0: Discharging, 28%, 01:09:38 remaining