понедельник, 1 декабря 2014 г.

Проблема запуска Minecraft на Linux с установленным OSS

После обновления Minecraft до версии 1.6 появилась проблема при запуске игры с установленным OSS по умолчанию. Как выяснилось, проблема была в библиотеке OpenAL, которая поставлялась вместе с этой версией игры. Простая замена ни к чему не привела, т.к. при запуске лаунчера все файлы игры распаковывались откуда-то из архива и заменялись. Поэтому я написал свой скрипт для запуска, который вы можете посмотреть здесь. Для этого скрипта следует создать директорию, в которой будут рабочие библиотеки (libopenal.so или libopenal64.so) можно взять в системной директории вашего дистрибутива или создать символические ссылки к ним.
Данный подход имеет один большой минус -- подобный запуск не позволяет играть на серверах с проверкой лицензии. Собственно, этот способ запуска является "пиратским". Поэтому пришла в голову идея заменять файлы библиотек прямо во время запуска, но после того, как они созданы лаунчером. Подобная идея описывается здесь, но я поступил гораздо проще, я взял из указанного скрипта лишь одну строчку и получил следующий скрипт:
#/bin/bash
MC_BASE_PATH=~/.minecraft
OPENAL=/usr/lib/i386-linux-gnu/libopenal.so.1
OPENAL64=/usr/lib/x86_64-linux-gnu/libopenal.so
CURRENT=$(inotifywait -q -r -e CREATE $MC_BASE_PATH/versions/)
DIR=$(echo $CURRENT | cut -d ' ' -f 3)
DIR=$(echo $CURRENT | cut -d ' ' -f 1)$DIR
echo "Created dir: $DIR"
if [ -e "$DIR/libopenal64.so" ]
then
    ln -sf $OPENAL64 "$DIR/libopenal64.so"
    echo "OpenAL was replaced"
    exit
fi
echo "OpenAL not foud"
Суть в том, что лаунчер при запуске создаёт временную папку в versions с нативными библиотеками, а при завершении работы игры удаляет её. Сразу же после создания папки скрипт заменяет в ней файлы на символические ссылки на системные библиотеки. Я оставил только замену 64-битной версии библиотеки, если система 32-битная, то следует заменять libopenal.so. Также я указал прямой путь к системным библиотекам -- переменные OPENAL и OPENAL64, для других дистрибутивов пути могут быть другие.
Я убрал проверку создания файлов, т.к. у меня команда inotifywait срабатывала только при создании папки, это работает на Debian wheezy, на остальных системах возможно она будет срабатывать и при создании файлов, поэтому я сделал проверку на наличие файла. То, что выводит команда inotifywait можно посмотреть, введя следующую команду, находясь в папке ~/.minecraft:
while true; do inotifywait -r -q -e create versions; done
После чего запускаем лаунчер, запускаем игру и выходим из неё. Затем останавливаем этот бесконечный скрипт, нажав Ctrl-C.

среда, 29 октября 2014 г.

Пакетная запись на dvd/cd-rw в linux

Существует два способа дозаписи на dvd-r и cd-r - это мультисессия и пакетная
запись. В первом случае можно использовать утилиту growisofs:
$growisofs -Z /dev/dvd -JRV "Диск 1" file1 file2 ...
здесь -J - использовать расширение jolie для отображение юникода и длинных имён
файлов, -R - RockRidge для сохранения атрибутов posix, -V - метка тома,
последние параметры - список файлов и папок.
Диск запишется, в дальнейшем для дозаписи нужно следующее:
$growisofs -M /dev/dvd -JRV "Диск 1" file3 "file 4" ...
т.е. меняется один параметр - -Z на -M, в первом случае диск инициализируется и
записывается первая сессия, во втором - записываются последующие сессии.
Подробнее можно узнать в man growisofs.
Данная утилита может иметь другие названия в разных дистрибутивах, в Debian -
growisofs.
Перейдём ко второму случаю, он заключается в том, чтобы отформатировать диск в
файловую систему udf, а потом использовать его как флешку, т.е. записывать файлы
сразу напрямую по отдельности, также можно удалять файлы. Для этого подходит
любая болванка, даже не перезаписываемая, типа dvd-r, но в этом случае при
удалении файлов место на диске освобождаться не будет. Для работы требуется
пакет udftools, который есть в репозитории Debian, он достаточно популярен,
поэтому должен быть и в других дистрибутивов. И так, необходимы следующие
действия:

1. Подготавливаем диск.

Для dvd-rw и bd-re:
$dvd+rw-format -force /dev/dvd
Для cd-rw:
$cdrwtools -q -d /dev/cdrw
Для dvd-r и cd-r пропускаем этот шаг.

2. Форматируем в файловую систему udf

$mkudffs -r 0x0150 --media-type=dvdrw /dev/dvd
Для cd-rw media-type будет cdrw, для dvd-r - dvd и т.д.
-r означает версию udf, если не требуется ничего особого, то лучше поставить
версию поменьше (1.5 хватит для любых целей) для гарантии, что диск будет
читаться на всех ОС. Можно без этой опции, тогда версия будет 2.01.
В файле README из документации пакета udftool написано, что нужно использовать
утилиту pktsetup и использовать вместо /dev/dvd (или /dev/sr0) что-то вроде
/dev/pktcdvd/0, но у меня из-за этого были жуткие тормоза, диск записывался
полностью аж за 10 часов. Этот способ можно использовать, если не получилось
напрямую через /dev/dvd:
$pktsetup 0 /dev/dvd
$mkudffs /dev/pktcdvd/0
В дальнейшем работаем уже с этим устройством.

3. Монтируем файловую систему и работем с ней

$mount -t udf -o rw,noatime /dev/dvd /media/dvd0
noatime нужно, чтобы при чтении не обновлялось время доступа к файлам. Это
сохранит ресурс rw диска и ускорит работу за счёт уменьшения количества
операций.

4. Завершаем работу

После завершения работы сбрасываем кэш файловой системы, отмонтируем её и
вытаскиваем диск:
$sync
$umount /media/dvd0
$eject
Хотя всё выполнится автоматически, если нажать кнопку на dvd-приводе, правда
придётся подождать, т.к. операции могут занять достаточно длительное время.

Дополнительно

Если в вашей системе не разрешены вышеприведённые команды на выполнение
обычному пользователю, то следует их запускать от имени суперпользователя (кроме
команды sync).
Данный способ записи плохо подходит, если требуется забить диск до отказа
мелкими файлами, т.е. производительность очень сильно страдает от этого, и
вместо 15 минут записи образа на dvd-rw, операция может занять несколько часов.
Даже при записи одного большого файла скорость записи dvd-rw 4x снижается до 3x.
Поэтому данный способ подходит, когда требуется регулярно дописывать на диск
небольшой объём данных, например при инкрементальном резервном копировании.
А вообще, если не требуется, чтобы диск читался на windows и других системах,
можно использовать любой тип файловой системы, например ext2 (желательно, чтоб
ФС не была журналируемой). Разумеется, в этом случае подойдёт только
перезаписываемый диск. Просто вместо mkudffs используем
$mkfs.ext2 /dev/dvd
Правда ждать придётся ооочень долго… Поэтому лучше сделать так:
Создаём образ (я обычно использую разряжённый файл):
$dd if=/dev/null bs=4700MB seek=1 of=dvd.img
Форматируем его:
$mkfs.ext2 dvd.img
Записываем:
$growisofs -Z /dev/dvd=dvd.img
Монтируем диск:
$mount /dev/dvd /media/dvd0
Ну и работаем, по производительности ничего не могу сказать, т.к. делал это
только в качестве эксперимента.
Также у меня не было возможности проверить работу на dvd-ram и bluray, но
отличия, скорее всего в способе очистки и опции media-type при форматировании.

суббота, 11 октября 2014 г.

Инкрементальный бэкап в линукс

Зачастую требуется резервное копирование большого количество данных, в которых
изменяется лишь незначительная их доля. Для этой цели подходит инкрементальный
бэкап, т.е. делается один полный бэкап, а потом записываются лишь изменения в
резервируемых данных.
Я не буду здесь рассматривать все существующие способы инкрементального
резервного копирования, приведу лишь 3, которыми я пользовался.

rdiff-backup

Самое просто решение, просто указываем две папки - откуда копировать и куда
копировать. Данная утилита определяет изменения в файловой системе и записывает
лишь их. В дальнейшем можно восстановить не только последнюю копию, но и все
копии, которые были сделаны до этого. Также при помощи rdiff-backup-fs можно
смонтировать каталог с резервной копией через fuse и получить виртаульную
файловую систему с папками, соответствующими времени копирования, в которых
будут находится файлы, скопированные в это время.
На данный момент утилита имеется в репозиториях большинства популярных
дистрибутивов, поэтому установка не должна составить трудности.

Примеры

Простое резервное копирование папки /home:
$ rdiff-backup /home/ /backup/
Резервное копирование определённых папок:
$ rdiff-backup --globbing-file-list lits.txt /home/user/ /backup/
Пример содержания файла list.txt:
+ /home/user/.asoundrc
+ /home/user/.bashrc
- /home/user/bin/netbeans-7.3.1
- /home/user/bin/eclipse
- /home/user/bin/eclipse-cpp
+ /home/user/bin
+ /home/user/Books
+ /home/user/.config
+ /home/user/databases
+ /home/user/.gconf
+ /home/user/.gconfd
+ /home/user/.local/share/gtg
+ /home/user/.local/share/gnote
+ /home/user/.local/share/Psi+
+ /home/user/.profile
+ /home/user/Projects
+ /home/user/.psi
+ /home/user/.purple
+ /home/user/list.txt
+ /home/user/scripts
+ /home/user/.Skype
+ /home/user/.ssh
+ /home/user/.vim
+ /home/user/.vimrc
+ /home/user/vimwiki
+ /home/user/Документы
+ /home/user/Рабочий стол
- **
+ означает добавить файл или директорию, - - убрать из списка резервного
копирования. В данном примере добавляем определённые каталоги, при этом из папки
bin исключаем некоторые папки, которые резервировать не нужно.
Вместо файла со списком можно использовать ключи --include, --include-regexp
и прочие, подробнее в man rdiff-backup.

Особенности

Можно выделить плюсы и минусы данного метода.
Плюсы:
  • можно получить доступ к любой версии резервируемых файлов;
  • можно удалять старые бэкапы.
Минусы:
  • резервная копия хранится в виде множества файлов, которые с каждым бэкапом
    обновляются до текущего состояния (из-за этого нет возможности дописывать
    бэкап на dvd-r, например).

Incremental tar

Архиватор tar, который содержится в любом дистрибутиве, умеет делать
инкрементальные архивы, если указать опцию -g с указанием файла снапшота.

Примеры использования

Создаём полный бэкап домашней папки:
$tar -cvjf /backup/home.tar.bz2 -g /backup/home.snapshot -C /home/user/ .
Делаем следующий бэкап (например, через неделю):
$tar -cvjf /backup/home.1.tar.bz2 -g /backup/home.snapshot -C /home/user/ .
Первая команда создаёт стандартный архив tar и снапшот состояния файловой
системы на момент бэкапа. Вторая команда читает этот снапшот и архивирует только
изменённые файлы.
Желательно, создавать свой файл снапшота для каждого архива, т.к. он каждый раз
обновляется. Это позволит делать инкрементальный бэкап не только от предыдущего,
но и от первого архива, т.е. создать дифференциальный бэкап.

Недостатки

Существует один недостаток - это то, как tar определяет, какие файлы изменились.
Он проверяет файлы по inode, сверяет атрибуты файла, если они изменились, то
добавляет файл в архив. Вроде бы всё хорошо, но некоторые файловые системы имеют
свойство менять inode файлов для оптимизации или просто не имеют таковых, а ядро
при монтировании назначает каждый раз произвольные значения. Таким образом, при
изменении inode всех файлов, получается полный бэкап. Я с этим столкнулся на
файловой системе btrfs. Также вообще не получится сделать подобное на fat.

Tar + rdiff

Это такой гибридный способ на основе предыдущих, я стал его использовать в
последнее время. Принцип состоит в следующем:
Создание первого бэкапа:
  1. Создаём полный архив tar без сжатия:
    $tar -cvf backup.tar /home
  2. Создаём файл signature с помощью rdiff:
    $rdiff signature backup.tar backup.signature
  3. Архив можно сжать для экономии места.
Создание следующих бэкапов:
  1. Создаём полный архив tar без сжатия.
  2. Создаём файл signature с помощью rdiff для этого архива, например:
    $rdiff signature backup1.tar backup1.signature
  3. Создаём файл rdiff - разницу между предыдущим и текущим архивами:
    $rdiff delta backup.signature backup1.tar backup1.rdiff
  4. Можно удалить backup1.tar
Как видно, для создания инкрементального архива не требуется наличие первой
полной копии. Как восстановить последний архив:
$rdiff patch backup.tar bakup1.rdiff backup1.tar
Если бэкапов несколько, то восстановление осуществляется по цепочке.
Сжатие архива и создание сигнатуры для первого архива, а также создание разницы
и сигнатуры для последующих архивов можно выполнить за один шаг, не создавая
несжатые файлы с полным архивом, для этого можно использовать именованные
каналы. Привожу пример скрипта для архивации (для понятности добавил
комментарии):
#!/bin/bash
prefix=all
dt=`date +%Y-%m-%d`
srcsignature="$1"
#Проверка вида бэкапа
if [ -e "$srcsignature" -a -n "$srcsignature"]
then
    ext="rdiff.xz"
else
    ext="tar.xz"
fi
sourcefile=$prefix.$ext
endfile=$prefix.$dt.$ext
sourcesignature=$prefix.signature
endsignature=$prefix.$dt.signature

#Создаём именованные каналы
mkfifo for_signature for_delta

#Создание сигнатуры
rdiff signature for_signature $sourcesignature &
if [ -e "$srcsignature" -a -n "$srcsignature"]
then
    #Создание дельты
    rdiff delta $srcsignature for_delta | xz -zc > $sourcefile &
else
    #Сжатие полного архива
    xz -zc for_delta > $sourcefile &
fi

#Архивация (исправить для использования)
tar -cvf - -C ~/ \
scripts/ \
Документы/ \
Projects/ \
vimwiki/ \
.local/share/gnote/ |\
tee for_signature for_delta > /dev/null

#На всякий случай ждём окончания действий
sleep 10
sync
#Переименовываем файлы
mv $sourcefile $endfile
mv $sourcesignature $endsignature

#Удаляем каналы
rm for_signature for_delta
В качестве единственного параметра этого скрипта выступает файл сигнатуры
предыдущего бэкапа. Если файл не существует, или запуск производился без
параметров, делается полный бэкап. Сам список задаётся в команде tar, там же
можно указать опции архивации.
Есть один недостаток - архивирование выполняется долго, т.к. по сути создаётся
полный архив, но оно того стоит, т.к. в этом случае, в отличие от
инкрементального копирования средствами tar, получаются файлы меньшего размера.
Дело в том, что rdiff находит разницу между бинарными файлами, а в случае с
архивами - между содержанием архивов. Т.е. если изменится незначительно большой
файл, то при помощи rdiff будут записаны только изменения этого файла, а при
помощи tar будет перезаписан весь файл полностью.

Итог

Всё зависит от способа хранения резервных копий, если записывать инкрементальные
архивы на dvd-r, то подойдут 2 и 3 способы, а первый подойдёт только в случае
копирования на внешний винчестер или на другой компьютер по сети.
P.S.:
Кстати, rdiff-backup, использует rdiff для хранения изменений в файлах, хотя об
этом можно догадаться и из названия.
P.P.S.:
Библиотека rdiff также используется в rsync.

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

GTD с использованием vim

Однажды я столкнулся с проблемой, что у меня куча работы, и ни на что не хватает времени. Использование банального тайм-менеджмента не приводило к положительным результатам, т.к. запланировав время для одного дела и выполняя его, я думал о том, что мне ещё нужно делать кучу дел, тем самым не мог сосредоточиться на текущем. Если в запланированное время не удавалось выполнить задачу, то время было потеряно, а задача переносилась на будущее. Помимо этого, современный темп жизни требует учёта множества мелочей, которые кажутся, на первый взгляд, не очень важными, но забывая о них, мы снижаем общую эффективность своей деятельности и ухудшаем отношение к себе тех людей, для кого эти мелочи важны. На самом деле существует много проблем в связи с огромным количеством входящей информации, которую необходимо учитывать. Совокупность всех не доведённый до завершения дел и проблем создаёт "кашу" в голове, неясность того, что нужно делать в первую очередь, приводит к ощущению нехватки времени и прочее.

Однажды, я наткнулся на книгу Дэвида Аллена "Как привести дела в порядок" (ориг. "Getting things done" или GTD), которая многое поставила на свои места, но не сразу. Я не буду описывать здесь подробно систему GTD, с ней вы можете ознакомиться в вышеупомянутой книге. Дальнейшая информация предполагает некоторое знакомство с этой системой.

Для начала расскажу предысторию. Я не сразу начал пользоваться vim для этих целей, а использовал готовую утилиту для Gnome - GTG. Да, она удобна, интуитивна понятна и делает половину действий за пользователя. Последнее её достоинство оказалось самым большим недостатком, т.к. очень важной частью системы является анализ всей содержащейся в ней информации. Этот процесс должен производиться вручную, иначе куча дел просто зависнут в системе и вы перестанете обращать на них внимание, в дальнейшем она обрастёт множеством таких "зависших" дел, станет неэффективным, после чего вы перестанете её использовать. Поэтому, если и использовать подобные системы, нужно подходить к этому с умом и не надеяться, что программа всё упорядочит за вас.

Сам по себе vim не представляет собой удобное средство для системы, но используя некоторые плагины, можно сделать полноценную систему GTD. Один из таких плагинов -- vimwiki, который позволяет создавать списки с отметками о выполнении, перекрёстные ссылки между файлами с возможностью перехода, форматирование и прочее.

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

Итак, после установки vim и плагина для него, можно приступать к оформлению системы. Запускаем vim или графическую оболочку для него -- gvim, нажимаем вводим \ww, открывается начальная страница по умолчанию для vimwiki. Можно создать систему прямо начиная с начальной страницы, можно создать подстраницы. Я выбрал второе, т.к. использовал уже vimwiki для других целей, поэтому добавил следующее:

[[GTD|gtd/]]

Эта строчка является ссылкой на каталог gtd, по умолчанию будет произведён запуск средства для просмотра каталогов внутри vim, поэтому нужно дополнительно настроить использование vimwiki, но об этом позже.

Далее, в соответствии с GTD создадим подстраницы для отдельных списков (или в корне vimwiki, или внутри каталога gtd):

=GTD=

* [[inbox|Входящие]]
* [[current|Текущие действия]]
* [[projects/|Проекты]]
* [[../diary/diary|Запланированное]]
* [[someday/someday|Когда-нибудь, может быть]]
* [[../|База знаний]]
* [[waiting|В ожидании]]

Здесь первая строчка - это заголовок первого уровня, далее идёт маркированный список со ссылками на списки. Вообще структура системы может у вас отличаться от моей, т.к. тут уже каждый подстраивает систему под себя. Как видно, синтаксис vimwiki очень похож на markdown (почему бы разработчикам vimwiki не использовать markdown без изменений?).

Первая ссылка - это корзина, т.е. "Входящие" в терминологии GTD, сюда записываем всё, что необходимо сделать. В дальнейшем корзина входящих будет разбираться и сортироваться.

Следующая ссылка - список текущих действий, отсортированный по контексту. Примерная структура списка следующая:

=Общее=

=Звонки=

=За компьютером=

== Интернет ==

=По пути=

=На работе=

=Дома=

=Повестка дня=

Это лишь заголовки, под ними следует вставить списки дел, что можно сделать по разному, например, с использованием TODO-списков, их синтаксис похож на обычные списки, только добавляются квадратные скобки:

* [ ] Задание 1
* [o] Задание 2
    * [X] Подзадание 2.1
    * [ ] Подзадание 2.2
    * [ ] Подзадание 2.3
* [ ] Задание 3

Списки могут быть вложенные, выполнение одного задания можно отметить, нажав Ctrl-Space.

Далее в основном списке идёт ссылка на список проектов, я её вынес в отдельный каталог, чтоб не загромождать основной каталог системы. Структуру я описывать не буду, здесь можно сделать вложенные todo-списки или ссылки на страницы с проектами.

Следующая ссылка - запланированные дела, я использовал встроенную возможность vimwiki создавать ежедневные файлы. Файл со ссылками на ежедневные файлы по умолчанию находится в папке diary и называется соответственно. Помимо этого можно использовать плагин Calendar и соответствующую команду, введя которую, слева появляется окошко с календарём, в котором можно быстро перейти к нужному дню и создать/посмотреть список дел для конкретного дня.

Далее идёт список отложенных дел, пишем туда всё, что не собираемся делать в ближайшем будущем, но, возможно, когда-нибудь это понадобится. Также внутри этого файла я создал 43 ссылки в соответствии с системой Аллена - это 31 ссылка, соответствующая дням месяца, и 12 ссылок, соответствующих месяцам. Эти ссылки могут использоваться, чтобы откладывать задания или информацию на определённый срок, чтобы в нужный момент обратиться к ней. Подробнее можно ознакомиться в соответствующей литературе.

Следующий пункт - справочная информация. Т.к. у меня первоначально vimwiki использовалась для хранения справочной информации, то в приведённом примере это ссылка на начальную страницу vimwiki.

Ну и последняя ссылка - список дел, выполнение которых ожидается от других людей или зависят от определённых событий. Просматривая этот список можно контролировать делегированные задания другим людям, и, по возможности, напоминать им о выполнении этих заданий.

Настройки vim

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

let g:vimwiki_use_mouse = 1
let g:vimwiki_folding = 1
let g:vimwiki_fold_lists = 1
let g:vimwiki_use_calendar = 1
let g:vimwiki_dir_link = 'index'
let g:vimwiki_browsers = ['firefox']
set textwidth=80

По порядку опишу опции:

  1. Использование мыши, позволяющее, например, переходить по ссылкам двойным щелчком.

  2. Использование складок. Скорее всего, список текущих дел будет слишком длинный и не будет умещаться на экране, использование складок позволить свернуть отдельные участки текста в соответствии с заголовками. Поэтому открыв список, вы будете видеть только заголовки, а введя zo складка будет открыта, и появится соответствующий список.

  3. Эта опция позволяет сворачивать не только заголовки, но и вложенные списки.

  4. Для того, чтобы правильно работала команда Calendar, нужно указать эту опцию.

  5. Везде ссылки на главную страницу каталога я заменял на ссылку на сам каталог, чтобы vim открывал не каталог, а заглавную страницу, нужна эта опция. В моём случае это index, т.е. при переходе по ссылке, например [[projects/]], будет произведён переход к файлу projects/index.wiki.

  6. Указывает программу для открытия интернет-ссылок.

  7. Ширина текста - это стандартная опция vim, которая форматирует текст по ширине во время ввода (см. справку vim).

Все остальные опции, которые касаются vim, у меня находятся в стандартном файле ~/.vimrc, это же отдельный файл, который я расположил в ~/.vimwiki.gvimrc, чтобы эти настройки активировались только при запуске vimwiki. Чтобы его задействовать и открыть сразу vimwiki, нужно запустить vim со следующими опциями:

gvim -U ~/.vimwiki.gvimrc -geometry 100x40+512+400 /home/vladimir/vimwiki/index.wiki

Тут я указал ещё размер окна gvim и его расположение. Можно создать кнопку запуска на рабочем столе и добавить туда эту команду. Чем проще получить доступ к системе, тем удобнее будет ей пользоваться, и тем больше вероятность, что вы действительно будете эффективно ей пользоваться.


пятница, 18 апреля 2014 г.

Доступ к SSH без ввода пароля или настройка ключей

Возможно, эта тема мало кого заинтересует, но когда-то я столкнулся с тем, что решил найти способ получения доступа по ssh без ввода пароля. Я не знал тогда о существовании способа авторизации при помощи ключей, поэтому в поиск вводил "доступ к ssh без ввода пароля", на то время (пару лет назад) ничего толкового не находил, или это было слишком сложно для меня. Поэтому я и решил написать эту статью в надежде, что кому-то она пригодится.

И так, авторизация через ssh может проходить не только при вводе пароля, а посредством обмена ключами. На клиентской машине хранится пара ключей, закрытый и открытый ($HOME/.ssh/id_rsa и $HOME/.ssh/id_rsa.pub соответственно). На сервере может существовать файл $HOME/.ssh/authorized_keys, содержащий в себе открытые ключи клиентов. Если открытый ключ клиентской машины содержится в этом файле сервера, то авторизация и последующее шифрование происходит при помощи этого ключа.

Следовательно, необходимо выполнить 2 шага:

  1. Генерация пары ключей на клиенте.

  2. Запись открытого ключа клиента в файл authorized_keys сервера.

Генерация ключей

Для генерации пары ключей предназначена команда ssh-keygen, которая доступна, если у вас установлен ssh-клиент. Она очень проста в использовании. Что бы создать пару ключей, нужно лишь запустить её без параметров. Сначала она спросит файл для записи закрытого ключа, тут можно ничего не вводить, просто нажать enter, чтобы создать файл по умолчанию. Далее вводим пароль. Если не вводить ничего, то закрытый ключ будет незашифрованный, и, получив к нему доступ, можно получить доступ ко всем серверам, на которые у вас настроена авторизация с помощью этого ключа. Поэтому нужно дать минимальные права для файла ключей. Если ввести пароль, то каждый раз придётся вводить этот пароль при входе на любой сервер, настроенный на этот ключ.

Запись ключа на сервер

Здесь можно поступить несколькими способами, первый из них - зайти на сервер и скопировать содержимое файла id_rsa.pub в authorized_keys, например, следующей командой:

$ cat ~/.ssh/id_rsa.pub | ssh user@host "tee -a ~/.ssh/authorized_keys"

где user и host - имя пользователя и адрес сервера, соответственно. От вас потребуется ввести пароль от аккаунта user на сервере host, после чего авторизация будет проходить при помощи ключей. В дальнейшем нужно будет вводить пароль от ключа или не вводить ничего, если ключ не зашифрован.

Второй способ доступен, по крайней мере, в debian - использование команды ssh-copy-id. После генерации ключей по умолчанию достаточно ввести:

$ ssh-copy-id user@host

Дальнейший процесс аналогичен предыдущему способу.

вторник, 18 марта 2014 г.

Rsync - синхронизация данных между устройствами

~/scripts/sync.html

Если вы пользуетесь более, чем одним компьютером, то, скорее всего, вам приходилось сталкиваться с тем, что данные, с которыми вы работаете, должны быть на всех компьютерах, при чём изменения, внесённые на одном компьютере, должны быть актуальны и на других. Для этих целей можно использовать флешку, и работать с ней напрямую, или пользоваться облачным сервисом для оптимизации, наподобие Dropbox или Яндекс-диск. При использовании флешки необходимо резервное копирование данных, так как флешка - устройство ненадёжное, да и можно просто её потерять. Использование облачных сервисов требует постоянного подключения к интернету, что может оказаться не всегда возможным. Предлагаю способ прямой (возможна косвенная) синхронизации между компьютерами с использованием rsync, которую использую я сам.

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

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

Ниже приведены скрипты, которые я использую для синхронизации компьютера и ноутбука.

Файл sync

 1 #!/bin/bash
 2 host="vladimir-laptop"
 3 if [ "$PARAMS" = "" ]
 4 then
 5     PARAMS="-aHvuzn --progress --delete-after"
 6 fi
 7 if [[ $1 == "-h" ]]
 8 then
 9     echo "Синхронизация файлов между компом и ноутбуком"
10     echo "Все каталоги и файлы читаются из файла synclist.txt"
11     exit
12 fi
13 if [ -z $2 ]
14 then
15     path=$host::vladimir
16 else
17     path=$(echo "$2" | sed 's/\/*$//')
18 fi
19 if [[ $1 == "to" ]]
20 then
21     sourcepath=$HOME
22     destpath=$path
23 else
24     if [[ $1 == "from" ]]
25     then
26         sourcepath=$path
27         destpath=$HOME
28     else
29         echo "unknown option: $1"
30         exit 1
31     fi
32 fi
33 echo
34 echo "Start syncronization..."
35 echo "rsync $PARAMS --files-from=synclist.txt -r $sourcepath $destpath"
36 rsync $PARAMS --files-from=synclist.txt -r "$sourcepath" "$destpath" || exit 1

Скрипт используется с двумя параметрами командной строки. Первый параметр - "to" или "from", зависит от направления синхронизации, второй параметр - это адрес устройства, если он не задан, по умолчанию в моём случае используется vladimir-laptop::vladimir, следует заменить на свой случай, т.е. задать переменную host и дальнейший путь синхронизации.

В этом примере путь указан через два двоеточие, это означает, что будет использоваться протокол rsync. Если использовать одно двоеточие, то будет использоваться ssh, если просто указать путь к папке, то, соответственно, будет прямая синхронизация внутри одного устройства (например, при синхронизации посредством флешки).

Для текущего компьютера путь по умолчанию задаётся $HOME, т.е. домашняя директория пользователя, запускающего скрипт.

Также для управления скриптом используется переменная окружения PARAMS, которая, если не задать её в оболочке, принимает значение по умолчанию, заданное в скрипте. Опишу подробно параметры:

  • -a - сохранять атрибуты файла: время изменения/создания, владельца, группу и прочее;
  • -v - печатать в стандартный вывод о производимых операциях;
  • -z - использовать сжатие;
  • -H - создавать на приёмнике жёсткие ссылки, как на источнике;
  • -u - заменять файлы только если на источнике они новее, чем на приёмнике;
  • -n - не производить реальных действий, только имитировать;
  • --delete-after - удалять файлы, которых не существует на источнике, при чём только после того, как будут скопированы и обновлены существующие файлы.

Поясню, зачем я использую имитацию и удаление только в конце. Чтобы не ошибиться и не перепутать направления синхронизации, я вызываю этот скрипт. Происходит следующее: rsync сравнивает данные на источнике и приёмнике, затем выводит все действия, которые следует сделать для выполнения синхронизации, в конце списка выводит удаляемые файлы. Таким образом сразу видно, что будет происходить, и, если в списке удаляемых файлов вдруг оказался файл, который я только что создал, становится понятно, что происходит что-то не то: перепутал направление или путь.

Поэтому я использую ещё один вспомогательный скрипт, который выполняет синхронизацию после того, как я убедился, что параметры введены верно, и данные не будут потеряны:

Файл realsync

1 #!/bin/bash
2 export PARAMS="-avuHz --progress --delete"
3 ./sync $@

Он просто задаёт параметры синхронизации:

  • --progress - показывать прогресс копирования отдельных файлов (удобно, если файлы имеют большой размер и требуется время для их копирования);
  • --delete - удалить файлы, которых не существует на источнике (просто удаляет в процессе синхронизации, а не в конце её).

Таким образом процесс синхронизации выполняется вызовом сначала ./sync, потом ./realsync. Можно из первого скрипта удалить параметр -n, но тогда можно случайно удалить нужные данные.

Помимо этого скрипт использует файл synclist.txt, содержащий пути к синхронизируемым файлам и папкам относительно домашнего каталога. Должен находится в каталоге, из которого вызывается скрипт. Например, мой файл выглядит так:

scripts/
Документы/
Projects/
vladimir.kdb
.local/share/gtg/
.local/share/gnote/
vimwiki/

Настройка rsync

Если вы собираетесь синхронизировать данные посредством флешки, то ничего настраивать не нужно, достаточно установить rsync. Вот только придётся отформатировать флешку в файловую систему, поддерживающую аттрибуты Posix, т.е. FAT и NTFS не подойдут.

Для синхронизации через ssh помимо установки самого rsync необходимо наличие ssh-сервера на удалённом компьютере. Также, чтобы не вводить каждый раз пароль, можно настроить ключи ssh.

Для синхронизации через протокол rsync, т.е. как в приведённом примере, нужно настроить демон rsync, для этого нужно в файл /etc/rsyncd.conf вписать что-то вроде:

[name]
    path = /home/user
    comment = Rsync syncronization
    hosts allow = 10.42.0.0/16

Здесь name - произвольное имя, оно будет использоваться после двойного двоеточия, comment - вообще произвольный коментарий, hosts allow - адреса, с которых разрешён доступ, можно опустить, тогда доступ будет разрешён с любого адреса.

Далее следует перезапустить демон:

#service rsyncd restart

Подробнее можно прочитать в man rsyncd.conf и man rsync.

пятница, 14 марта 2014 г.

Ведение заметок в Linux

Наверное, каждому пользователю персонального компьютера встречается время от времени информация, которую хотелось бы запомнить или сохранить. Первое, что может придти в голову - это добавить закладку в браузер или сохранить целиком заинтересовавшую страницу, если информация попалась вам при блуждании по просторам интернета, или создать файл в текстовом редакторе и сохранить его куда-нибудь. Вариантов масса, однако, в таком случае информация может быть разрозненна и найти что-то в дальнейшем будет достаточно сложно, особенно, если что-то было сохранено через браузер, что-то было набрано вручную или отсканировано и где-то сохранено на жёстком диске.

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

Gnote/Tomboy

Эти две программы я рассматриваю одновременно, т.к. их возможности почти полностью совпадают, отличие лишь в том, что Gnote написан на Си с использованием библиотеки Gtk+, а Tomboy написан на C# и работает под управлением Mono.

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

Сам я пользовался сначала Tomboy, потом перешёл на Gnote, и это был основной инструмент для ведения заметок. Постараюсь перечислить плюсы и минусы этих систем, информация по большей части относится к Gnote, в Tomboy может что-то отличаться.

Плюсы:

  • Простота в использовании, можно быстро добавить заметку.
  • Интеграция с Gnome.
  • Поддерживаются ссылки на другие заметки и внешние гиперссылки.
  • Встроенный полнотекстовый поиск.

Минусы:

  • Нельзя вставлять картинки, таблицы.

Программы свободные и присутствуют практически в любом современном дистрибутиве Linux.

Набор текстовых/markdown/html/odt и прочих файлов

Да, это тоже может быть неплохим вариантом для хранения заметок. При этом имеется возможность сохранять всю информацию в первозданном виде. Но если вы хотите, чтобы информация была каким-то образом структурирована, то нужно делать это вручную. Если нужно что-то поменять, поставить пометку и прочее, то это дело может оказаться не таким простым, особенно для неопытного пользователя.

Например, если нужно внести изменения в html-страницу, то нужно использовать соответствующий редактор, который может испортить первоначальное форматирование, а редактирование исходного текста страницы требует подготовки.

Для структурирования может подойти сама файловая система, т.е. разбиение по каталогам уже внесёт структуру. С полнотекстовым поиском сложнее, если файлы имеют различный формат, требуется стороннее программное обеспечение, предназначенное для этой цели. В случае текстовых файлов может помочь консольная утилита grep.

Рассмотрим несколько форматов по отдельности кроме текстового, т.к. там всё и так понятно.

Markdown

Это расширенный способ хранения текстовых файлов. Формат файла при этом остаётся текстовым, но редакторы, поддерживающие этот формат, отображают текст отформатированным соответствующим образом, т.е. заголовки, списки, ссылки и даже, в некоторых случаях, таблицы и рисунки. Формат легко конвертируются во множество других при помощи утилиты pandoc. Данный формат комбинирует в себе достоинства текстовых файлов и более сложных, типа html или odt.

Достоинства:

  • Простой текстовый файл.
  • Достаточно легко конвертируется из html, если последний не имеет изображений.
  • Полнотекстовый поиск возможен через grep или другие утилиты.
  • Поддерживается форматирование текста (атрибуты шрифта, заголовки).
  • Поддерживаются ссылки, как локальные, так и внешние.
  • Поддерживается вставка картинок.
  • В некоторых редакторах возможно также ведение таблиц.

Недостатки:

  • Картинки вставляются в виде ссылок, поэтому нужно позаботиться о доступности файла с изображением, сама картинка в текстовом файле, по понятным причинам, не отображается.
  • Мало редакторов, поддерживающих этот формат (имеется в виду отображение форматирования), например, vim или emacs.

Кстати, эту статью я набирал в vim с использованием markdown с последующей конвертацией в html.

HTML

Если нужная информация попадается вам преимущественно через интернет, то данный способ её хранения может быть достаточно удобным, т.к. любой браузер поддерживает сохранение страниц со всем содержимым. Также возможно создать файл-содержания на том же html со ссылками на другие файлы, можно даже реализовать целую wiki-подобную систему, всё зависит от ваших желаний и знаний html. Помимо этого файлы практически любого формата могут быть сконвертированы в html.

Достоинства:

  • Поддерживаются очень широкие возможности по форматированию текста.
  • Можно быстро сохранять информацию из браузера.
  • Возможна конвертация из других форматов, текстовые процессоры вроде Libre Office Writer, поддерживают экспорт в html.
  • Поддержка ссылок, в том числе на текст внутри документа.
  • Возможность вставки изображений.
  • Возможность вставлять произвольный контент, даже видео (хотя здесь уже возникают некоторые трудности).

Недостатки:

  • При простом сохранении из браузера сохраняется много лишней информации.
  • Полнотекстовый поиск возможен только при помощи стороннего программного обеспечения (хотя вроде есть способ самими средствами html, т.к., например, справка по языку Perl распространяется именно в виде html, и там присутствует полнотекстовый поиск).
  • Сложности с редактированием, хотя, если привыкнуть и подобрать подходящее ПО для этого, то всё довольно тривиально.

ODT и прочее

Достоинства:

  • Лёгкость редактирования и вставки информации из любых источников.
  • Широкие возможности форматирования текста.
  • Поддержка ссылок, при чём даже внутри документа.

Недостатки:

  • Часто, это сложный формат, поэтому возникает сложность, если вы захотите использовать что-то другое, другую систему, другой формат хранения.
  • Ещё более затруднён полнотекстовый поиск.

VimWiki

Если вы любитель vim или хардкорный пользователь линукс, то этот вариант может вам подойти. Это уже не просто какой-то формат файла, это целая система, очень гибкая, настраиваемая, вы сами вольны в выборе структуры данных. Используя vimwiki, вы будете думать только о структурировании информации, а не файлов, в которых она хранится. Формат самих файлов подобен markdown, но значительно отличается по синтаксису, при этом переход по внутренним ссылкам возможен внутри текстового редактора. Также имеется множество встроенных функций по форматированию, например, легко создаются текстовые таблицы, списки, имеется поддержка TO-DO списков и многое другое. В общем, система предназначена именно для хранения и упорядочивания информации любого рода.

VimWiki - это плагин для vim, который легко устанавливается, и его можно взять здесь, также там можно посмотреть подробную информацию о плагине.

Преимущества:

  • Простой текстовый формат.
  • Широкие возможности по структурированию информации.
  • Встроенная команда для полнотекстового поиска по шаблону.
  • Поддержка ссылок и форматирования текста.
  • Поддержка таблиц и средства для их редактирования.
  • Поддержка TO-DO списков.
  • Поддержка рисунков.
  • Встроенные возможности конвертации в набор html-страниц.

Недостатки:

  • Сложность вставки информации, т.к. форматирование в любом случае теряется.
  • Требуется подготовка для того, чтоб использование было простым и комфортным.
  • Рисунки, разумеется, в vim не отображаются, а только после конвертации в html, при этом нужно следить за доступностью самого изображения (лучше сохранить в каталог с html-файлами).

Лично я остановился на использовании этого способа хранения информации и даже написал конвертер из Gnote/Tomboy.

Evernote

Я думаю, если вы задумываетесь о том, каким образом хранить заметки, то вы, скорее всего, уже встречали упоминание об этой системе в интернете. Возможности гораздо шире, чем у всех перечисленных выше способов, даже есть встроенные средства синхронизации, онлайн-доступ и программа для мобильных устройств. Существуют плагины для большинства браузеров, что позволяет не только добавить быстро заметку, но и убрать на лету ненужную информацию, при чём автоматически. Вставка изображений, поддержка TO-DO списков и многое другое. Возможно хранение не только текстовой информации, но и звуковой, и даже видео.

Сам я пробовал некоторое время пользоваться ей, но то, что данное решение несвободно, а также отсутствие нормального приложения для линукс перечёркивает все его достоинства.

PS

Я попытался рассмотреть здесь лишь те способы, которые сам использовал, и на себе ощутил достоинства и недостатки каждого из них. Можно также рассмотреть вариант с каким-нибудь wiki-движком под Apache, который может использоваться локально через браузер, но это уже слишком сложная система для простого хранения заметок.

В достоинства я включал такой пункт, как "Простой текстовый формат", возможно, кто-то спросит: "В чём же состоит достоинство?" Это моё личное мнение, может кто-то разделит его со мной, кто-то нет. Дело в том, что с текстовыми файлами вы можете делать всё, что вздумается, например, можно использовать вместе с системой хранения заметок систему управления версиями, с помощью которой вы сможете отслеживать сделанные изменения, что затруднено при использовании сложных форматов. Также содержание текстового файла можно менять любым редактором, и не требуется специализированное программное обеспечение.