четверг, 1 марта 2018 г.

Установка OpenWRT на Dlink DIR-615 E4

Опишу историю, как я устанавливал OpenWRT на Dlink DIR-615 E4 из-под линукс.

Решил установить неоригинальную прошивку, почитал, как это сделать на офф сайте OpenWRT: https://wiki.openwrt.org/toh/d-link/dir-615

Оказалось, что в моём случае не пришлось использовать танцы с бубном, описанные в соответствующем разделе, посвященном модификации C1 и E4. Я просто прошил через стандартный веб-интерфейс роутера.

Всё заработало сразу, кроме wifi.

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

Затем, гугля кучу ненужного, нашёл, что из-за того, что у роутера всего 4 Мб флеш, на него не помещаются пакеты kmod-ath9k и wpad-mini. Я их пробовал ставить – действительно не помещаются. А другие пакеты не удаляются, т.к. вшиты.

Между тем попробовал dd-wrt ( http://www.dd-wrt.com ), всё работало, но я хотел именно OpenWRT. В мануале по прошивке OpenWRT была ссылка https://forum.openwrt.org/viewtopic.php?id=62912 , перейдя по которой были примеры, как уместить в прошивку и wifi и luci. Для этого нужно было разобраться, как эту прошивку делать самому, что описано в https://wiki.openwrt.org/doc/howto/obtain.firmware.generate .

И так, я скачал ImageGenerator, как написано. А конкретно по ссылке: https://downloads.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/OpenWrt-ImageBuilder-15.05.1-ar71xx-generic.Linux-x86_64.tar.bz2 , распаковал, добавил файл ./files/etc/config/wifitoggle с содержимым:

config wifitoggle
    option button    'wps'

    option persistent    '0' 
    option timer        '0'

    option led_sysfs        'd-link:blue:wps'
    option led_enable_trigger    'none' 
    option led_enable_delayon    '0'
    option led_enable_delayoff    '0'
    option led_disable_default    '0'

Запустил сборку, выключив ppp и ipv6, но включив руссификацию luci:

make image PROFILE=DIR615E4 PACKAGES="kmod-ath9k wifitoggle wpad-mini luci \
luci-i18n-base-ru -wpad -hostapd -hostapd-mini -ppp -ppp-mod-pppoe -kmod-ppp \
-kmod-pppoe -kmod-pppox -ip6tables -odhcp6c -kmod-ipv6 -kmod-ip6tables \
-luci-proto-ipv6 -luci-proto-ppp" FILES=files/

После чего появились файлы в папке ./bin/ar71xx. Два файла являются прошивками: openwrt-15.05.1-ar71xx-generic-dir-615-e4-squashfs-factory.bin – для полной прошивки со сбросом настроек, openwrt-15.05.1-ar71xx-generic-dir-615-e4-squashfs-sysupgrade.bin – для обновления существующей прошивки OpenWRT.

После dd-wrt пришлось потанцевать с бубном, как в мануале по первой ссылке. Перезагрузился на винду, через телефон скачал Firefox 13 Portable, после этого получилось прошить. В линукс как только не извращался, даже из VirtualBox запускал IE 6.

Дело в том, что я из консоли пытался прошить, т.к. dd-wrt никак не хотел использовать другую прошивку. В итоге даже там ничего не получалось, пока я из девайса не сделал кирпич где-то нагугленной командой:

mtd -e linux -r write firmware.bin linux

На самом деле нужно было:

mtd -r write firmware.bin firmware

но возникала ошибка, что этот firmware не доступен для записи. firmware.bin – любая прошивка.

Вообще, этот метод должен работать, но не на dd-wrt. Читал, что люди никак не могли файл прошивки закинуть на роутер, для этого приходилось поднимать веб-сервер на компе. Но, зная линукс, можно многими способами это сделать, не устанавливая ничего лишнего. Я сделал через netcat:

nc 192.168.1.125 9900 > /tmp/firmware.bin – на роутере;

nc -l 9900 < firmware.bin – на компе (тут вместо firmware.bin может быть любой файл, который нужно передать).

В общем прошил я снова OpenWRT, что ставил первую, затем, убедившись, что всё работает, прошил одной из своих сборок, которую сделал, как указано выше. Wifi включается, всё работате, даже установил vnstat для статистики потребления трафика.

понедельник, 7 августа 2017 г.

Как я получил root на Android 5.1.1 в Xperia ZR

Возникла у меня проблема со свободным местом на телефоне, хотелось как-то его освободить от встроенных ненужных приложений, а также получить вомзожность полного переноса приложений на флешку. Для этого нужен разблокированный доступ root. На 5ой версии андроида я не нашёл простого способа получить root.
Насколько я знаю, можно разлочить загрузчик и получить рут напрямую с помощью FlashTool, но я сначала решил, что это сложно, т.к. нужно обращаться на официальный сайт Sony и там получать ключ разработчкика. Как оказалось, это просто и всё делается в автоматическом режиме, достаточно ввести в форму свой email, а потом IMEI. Загрузчик я разблокировать не стал, поступил другим путём.
Сначала я откатился на Android 4.4.4: https://4pda.ru/forum/index.php?showtopic=475149 с помощью FlashTool (версия для linux). Очень всё просто – запускаем, подключаем телефон, выбираем файл с прошивкой, далее средуем инструкции.
Далее получил Root с помощью KingoRoot. Кстати, т.к. я на линукс, получал доступ с помощью VirtualBox. На 7ке у меня не получилось, и не получалось до этого. На XP всё прошло успешно (а может и на 5 версии получилось бы?). В общем я два раза всё усложнил. Здесь единственное, где я использовал винду. Можно было разлочить загрузчик и может сработало бы мобильное приложение KingRoot. Тогда вообще всё на линуксе получилось бы.
Затем я установил recovery здесь, а точнее здесь.
Устанавливал я не через Windows, просто открыл файл install.bat и выполнил инструкции в консоли. Можно по идее на bash переписать, но это не каждый день делается... Главное, чтоб adb был установлен.
Далее я скачал прошивку: https://4pda.ru/forum/index.php?showtopic=665770&st=3720#entry46563614 и установил её с помощью recovery. Чтобы попасть в recovery нужно после включения и появления надписи "Sony", когда телефон провибрирует и индикатор загорится зелёным, нажать клавишу громкости.
Для этого нужно сделать через него wipe всего, после этого указать "install zip" и ждать.
А как оказалось... Нет там никакого рута. В итоге просто запустил KingoRoot на XP и всё заработало. Т.е., возможно, ничего не нужно было этого делать.
В общем сделал я, возможно, много лишнего, но всё же добился своей цели.
Также я теперь знаю, что всё можно сделать на Linux. При этом не нужно устанавливать кучу программ, как на винде. Драйвер для Android уже есть в ядре, JVM, скорее всего, у всех установлен (необходимо для запуска FlashTool), adb устанавливается из репозитория и выполняются обычные команды в консоли. Единственное, что нужно скачать – это FlashTool.

четверг, 13 августа 2015 г.

Просто о git

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

Установка

 Для установки пользователям линукс достаточно в консоли ввести команду для установки git, например, для Debian это:
# apt-get install git
Также можно установить удобные графические утилиты: git-gui, git-gtk, gitg и т.д. Gitg, например, позволяет вообще не вникать в суть команд, если не требуется каких-то более сложных действий, чем создание коммитов и переход между ветками.
Для пользователей Windows можно скачать git с сайте git-scm.com, однако, при добавлении в репозиторий файлов с русскими названиями, может возникнуть проблема, в этом случае лучше установить cygwin и при установке выбрать один из пакетов – git (он во вкладке devel, если я не ошибаюсь).

Создание репозитория

Для создания репозитория есть два пути: создать новый или клонировать существующий. Для создания репозитория вводим в папке с файлами, версии которых нужно отслеживать:
$ git init
Очень просто. Чтобы клонировать существующий репозиторий нужно ввести:
$ git clone protocol://url
где protocol – протокол, по которому будет производиться передача данных. Git умеет работать с множеством протоколов: http, https, ftp, ssh, git (собственный протокол), file (если репозиторий хранится локально). url – это адрес, который вы должны знать, раз собрались клонировать чей-то репозиторий.

Добавление данных и их фиксация

Для добавления данных в репозиторий служит две команды: add и commit. Первая добавляет файлы в "кэш" репозитория, вторая фиксирует данные.
$ git add <список файлов или .>
$ git commit
Если ввести commit с индексом -a, то автоматически будут добавлены файлы, которые изменились и ранее были добавлены в репозиторий. С ключём '-m <сообщение>' можно добавить сообщение, которое будет показываться при просмотре истории. Если ключ -m не указан, то будет открыт текстовый редактор, в котором это сообщение можно будет ввести, т.е. сообщение – обязательно.
Собственно, фиксация – это и есть "версия" или "коммит", т.е. если файлы будут регулярно изменяться, а мы будет эти изменения фиксировать, то в дальнейшем можно перемещаться от версии к версии, при этом все файлы, ранее добавленные, будут в том состоянии, в котором они были на момент фиксации.

Переход к определённой версии

Допустим, мы сделали какие-то изменения в каталоге, зафиксировали, и хотим вернуться к какой-то более старой версии. Для этого существует команда checkout:
$ git checkout <версия>
Версия указывается либо в виде тега (об этом ниже) или названия ветви (тоже ниже), либо в виде идентификатора коммита, который можно посмотреть, введя
$ git log
Эта команда выведет список всех версий, в начале описания каждой версии будет идти тот самый идентификатор, далее описание и т.д.
Чтобы вернуться к последней версии, нужно ввести:
$ git checkout HEAD
Если захотелось совсем отбросить последние версии, например, из-за большого количества ошибок, то нужно ввести:
$ git reset --hard <версия>
Здесь параметр --hard удалит напрочь все изменения после версии <версия>, поэтому нужно быть внимательным, вводя эту команду. Без этого параметра версии будут удалены, но все файлы в папке останутся в том состоянии, в котором они были до ввода команды, в отличие от команды checkout.

Теги

Также можно помечать определённые версии тегами, для этого существует команда tag:
$ git tag <название>
Название не должно содержать пробелов, однако можно ввести подробное описание также используя ключ -m. Посмотреть список тегов:
$ git tag
Посмотреть список тегов с описанием:
$ git tag -n
(после -n может идти число - количество строк).

Ветки

Ветки – это "ветвления" в истории версий, т.е. после определённой версии изменения могут идти по двум путям, например, один – основной, в котором предполагаются стабильные версии без критических ошибок, второй – экспериментальный, в который можно вносить любые изменения и не бояться потерять данные из первого пути.
Допустим, файлы находятся в каком-то состоянии, и мы хотим, чтобы от этого состояния можно было производить изменения по двум путям. Для этого нужно создать ветку:
$ git branch <название>
Название ветки не должно содержать пробелов. Теперь можно переключиться на эту ветку с помощью команды checkout.
Если нужно создать ветку не от текущего состояния, то используем
$ git branch <название> <версия>
Если нужно создать ветку и сразу же на неё переключиться, то:
$ git checkout -b <название> <версия>
Если не вводить версию, то ветка будет создана от текущего состояния.
При создании репозитория по умолчанию создаётся одна ветка – master.

Удаление ненужных версий

Редко, но требуется привести репозиторий в порядок и удалить из него лишние версии, например, чтобы уменьшить место, занимаемое репозиторием. (если ваш репозиторий используется несколькими людьми, то лучше так не делать, либо это должно быть оговорено с остальными пользователями, т.к. при этом действии всем придётся скачивать все версии после удалённой)
Для этого (и для многого другого) используется команда rebase, самое её простое применение:
$ rebase -i <версия>
где версия – это та версия, следом за которой будут производиться изменения в истории версий. То есть изменения можно производить в версиях, позже, чем введённая.
После ввода команды откроется текстовый редактор, в котором будет достаточно пояснений, чтобы понять, что делать. Нужно слева от версий установить определённые флаги, например, чтобы удалить версию, нужно ввести squash (все изменения просто объединятся с той версией, что выше по списку, т.е. удалится не та версия, рядом с которой ввели слово, а та, что выше), после сохранения документа будет произведено изменение истории, при этом с каждым удалённым коммитом будет предложено ввести новое описание для того коммита, с которым он был объединён. Этого можно избежать, если вместо squash ввести fixup. Кстати, можно не полностью вводить слова, а только первые буквы. Если ввести edit, то после сохранения будет запущен текстовый редактор, в котором можно изменить описание версии.

Считаю достаточным такое описание, если что вспомню, добавлю сюда. Если будет время, то опишу более подробнее, но в другом сообщении.

четверг, 6 августа 2015 г.

Захват и обработка видео из консоли

Для обработки видео существует такая утилита, как ffmpeg, которая поддерживает огромное количество кодеков и форматов аудио и видео.

Захват видео с экрана

$ ffmpeg -y -f x11grab -threads 0 -r 10 -s 1920x1080 \
-i :0.0 -preset slower -tune stillimage -an file.mkv
Описание:
  • -y – перезаписывать существующие файлы;
  • -f x11grab – запись с экрана;
  • -threads 0 – автоматически задавать максимальное количество потоков, если указать, число, то можно задать максимальное количество потоков;
  • -r 10 – кадров в секунду;
  • -s 1920x1080 – размер изображения;
  • -i :0.0 – экран для захвата (можно и удалённо), если указать :0.0+10,20 , то запись будет идти с соответствующим смещением на экране;
  • -preset slower — предустановка режима записи, существует множество (от ultrafast – самый быстрый режим с большим битрейтом, до placebo – очень медленный режим с минимальным битрейтом), лучше смотреть man x264 и подобрать настройку под производительность системы и выбранную частоту кадров;
  • -tune stillimage – предустановка для типа изображения, в данном случае - статическое изображение, т.е. запись с экрана обычных действий (игры записать не получится, для этого нужно указать film или вообще не указывать ничего);
  • -an – записывать без звука.
Кодек для записи видео можно указать явно через -vcodec …, по умолчанию для mkv используется libx264.
Для записи звука нужно указать -f oss -i /dev/dsp -acodec libfaac -ab 192k для oss (для ALSA не знаю…).
  • -f oss – запись через oss;
  • -i /dev/dsp – устройство записи (если несколько звуковых карт, указать своё);
  • -acodec libfaac – кодек записи, этот более-менее оптимальный, хотя faac гораздо хуже оригинального от nero;
  • -ab 192k — битрейт аудио.

Разрезать видео

ffmpeg -i video.mkv -ss 10:20 -t 15:00 -vcodec copy -acodec copy video2.mkv
Здесь следует сказать только о двух параметрах:
  • -ss – смещение относительно начала файла мин:сек;
  • -t – длина видео. 
Время может быть указано в формате  hh:mm:ss[.xxx] вплоть до миллисекунд.

Склеить несколько видео

Судя по всему, можно склеивать только видео формата ts и mpg. Для склеивания видео в формате mkv или mp4 с кодеком h264 видимо можно только перекодировав.
ffmpeg -i concat:"video1.mpg|video2.mpg" -vcodec copy -acodec copy video_out.mpg
Три варианта использования с перекодированием:
  • Первый вариант с последовательным перекодированием каждого видео:
    ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
    ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
    cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg
    ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
    
  • Вариант с отдельным перекодированием и одновременной склейкой и обратным перекодированием средствами ffmpeg:
    ffmpeg -i input1.avi -qscale:v 1 intermediate1.mpg
    ffmpeg -i input2.avi -qscale:v 1 intermediate2.mpg
    ffmpeg -i concat:"intermediate1.mpg|intermediate2.mpg" -c copy intermediate_all.mpg
    ffmpeg -i intermediate_all.mpg -qscale:v 2 output.avi
    
  • Вариант, позволяющий делать всё параллельно (идеально подходит для многоядерных процессоров):
    mkfifo intermediate1.mpg
    mkfifo intermediate2.mpg
    ffmpeg -i input1.avi -qscale:v 1 -y intermediate1.mpg < /dev/null &
    ffmpeg -i input2.avi -qscale:v 1 -y intermediate2.mpg < /dev/null &
    cat intermediate1.mpg intermediate2.mpg |\
    ffmpeg -f mpeg -i - -c:v mpeg4 -acodec libmp3lame output.avi
    

четверг, 30 июля 2015 г.

Как перенаправить все запросы в Apache2 одному скрипту

В web-программировании существует проблема, что при запросе разных страниц (речь идёт о php) вызываются разные скрипты, то есть программа на php имеет множество точек входа, что не есть правильно, т.к. в рамках одного приложения должны производиться какие-то одинаковые действия при запуске и остановке (открытие файлов, инициализация объектов, подключение к базе данных и т.д.), поэтому в каждом файле необходимо включать единый скрипт инициализации, что не совсем удобно.
При другом подходе, когда существует один скрипт, но запрос страниц происходит через get-параметры, требуется чётко следить за путями к содержанию страниц, т.е. если мы хотим включить в страницу некоторый файл html, который расположен не в корневом каталоге, и который имеет картинки и другой контент, то нужно позаботится о том, чтобы ссылки на странице были относительно файла скрипта корректными. Такой подход также используется в сайтах, написанных, например, на Perl или Python.
Чтобы избежать такой ситуации, но так, чтобы пользователь видел адрес запрашиваемой страницы в нормальном виде, можно включить обработчик, то есть при запросе страницы будет передано управление одному скрипту, который получит в параметрах адрес запрашиваемой страницы. Таким образом, например, можно написать контент для сайта в виде простых html-файлов, а оформление страницы будет задаваться единым шаблоном с помощью одного скрипта.
Существует по крайней мере 2 способа передачи управления одному скрипту. Заранее скажу, что после включения/выключения модов следует перезапускать Apache.

Мод Actions

Для того, чтобы задействовать эту возможность, нужно включить мод:
# a2enmod actions
Далее в настройках виртуального хоста или в файле .htaccess в корневой папке сайта нужно добавить следующее:
# Документы этого типа мы желаем "пропускать" через обработчик
AddHandler handler .html .htm .php
# Замкнем имя обработчика на конкретный файл
Action handler /index.php?
Здесь handler – просто удобное название обработчика.
/index.php? указывает на то, что всё будет перенаправлено скрипту /index.php через GET-параметры. Если не указать знак вопроса, то параметры будут переданы через POST.
Скрипту будет передан один параметр – строка запроса, т.е., например, если мы введём http://example.com/somedir/file.html?action=foo, то скрипт получит параметр /somedir/file.html?action=foo.
Здесь есть минус – параметры, переданные пользователем, нужно обрабатывать самостоятельно, то есть в php они будут недоступны в массиве $_GET. Кроме того, файлы .php почему-то не хотят перенаправляться, хотя им можно дать расширение html, и тогда пользователю будет казаться, что сайт – статический.

Мод Rewrite

Можно активизировать мод rewrite, который просто подменяет введённый адрес на заданный. Для включения мода нужно ввести:
# a2enmod rewrite
После чего в .htaccess или в конфиг сайта добавить:
#Включить подмену адреса
RewriteEngine on
#Подменять, только, если это не index.php
RewriteCond %{REQUEST_URI}  '!=/index.php'
#Поменять все php, html и htm страницы
RewriteRule ^.*\.(php|html|htm)\??.*$ /index.php
  • RewriteEngine on – обязательно вводится, чтобы подмена работала.
  • RewriteCond – необязательный параметр, используется условие подмены, в данном
случае проверяется, чтобы сам скрипт не был перенаправлен сам себе (хотя может ничего страшного и не будет, я не пробовал отключать).
  • RewriteRule – самый главный параметр, указывает, как подменять запрос, здесь
используются регулярные выражения, первое – что подменять, второе – чем.
По сравнению с обработчиком, параметры GET передаются в php в массив $_GET, в Perl доступны через модуль CGI и т.д. Строка запроса доступна через $SERVER["REQUEST_URI"], из которой можно вытянуть запрашиваемый файл и обработать его должным образом.
Лично я пользуюсь именно таким способом.

суббота, 25 июля 2015 г.

Настройка виртуальных хостов в Apache2 (в linux)

Основные настройки сервера можно найти в /etc/apache2 (debian):
  • apache2.conf – общие настройки, их можно и не трогать;
  • sites-available/*.conf – доступные настройки для сайтов;
  • sites-enabled/*.conf – настройки активных сайтов;

Виртуальные хосты

Чтобы добавить сайт, нужно настроить виртуальный хост для него (нужен домен). То есть по запросу сайта по адресу example.com будут задействованы одни настройки, а если на этом же сервере, но запрос сайта будет по адресу test.com, то будут задействованы другие настройки. Таким образом, разегистрировав несколько доменов или используя несколько поддоменов, можно разместить на одном сервере несколько сайтов, независимых друг от друга.
Для включения нужно создать файл в sites-available/ с расширением (обязательно) .conf, можно скопировать файл по умолчанию, находящийся в той же папке, чтобы не писать с нуля.
Примерное содержание файла:
<VirtualHost *:80>
 ServerName example.ru
 ServerAlias www.example.ru

 ServerAdmin admin@example.ru
 DocumentRoot /var/www/example.ru/
 
 <Directory /var/www/example.ru>
  AllowOverride All
  Order allow,deny
  allow from all
 </Directory>

 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

  • *:80 указывает, что с любых адресов будут обрабатываться запросы на порт 80.
  • ServerName – адрес виртуального хоста, т.е. все запросы на сервер по доменному  имени example.ru будут обрабатываться именно с этими настройками.
  • ServerAlias – просто дополнительное имя.
  • ServerAdmin – почта администратора сервера (не знаю зачем, и как действует).
  • DocumentRoot – расположение данных сайта.
  • Directory… – настройки каталога, каталог может быть любым, в том числе и вложенным в основной, и даже корень /.
    • AllowOverride All – позволить перезаписывать настройки для каталога из файлов .htaccess. Остальные настройки не знаю, оставил, как было по умолчанию.
  • ErrorLog и CustomLog – логи сервера, также есть настройки для уровня ведения логов.

Включение виртуального хоста

Чтобы включить хост, нужно запустить команду a2ensite <фал настроек (без пути)> от суперпользователя, apache сделает необходимые действия и сайт будет доступен.
Теперьм можно наполнять папку /var/www/example.ru/
После изменения конфигов нужно запускать # service apache2 reload, а после включения/выключения сайтов # service apache2 restart.

понедельник, 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.