Meefik's Blog

Freedom and Open Source

Снимок файловой системы и поиск изменений

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

Формат запуска утилиты такой:

java -jar jcut.jar <directory> [snapshot.gz]

Пример использования (жесткий диск SATA 7.2k):

$ java -jar jcut.jar /path/to/dir
add	/dir1	0
del	/dir2	0
del	/dir2/file1	1433802787000
mod	/file1	1433802751000
Time: 3742 ms
Processed: 209846 items
Snapshot: 1384480 bytes

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

Поворот экрана в режиме кадрового буфера

Ниже приводится решение для правильного поворота экрана в режиме фрейм-буфера. Т.е. чтобы была повернута картинка на 90 градусов (ландшафтная ориентация) и драйвер сенсорного экрана обрабатывал это поворот корректно. Решение опробовано на Samsung Galaxy S2 (i9100), тачскрин MXT224 (узнать модель тачскрина можно командой: cat /sys/devices/virtual/sec/sec_touchscreen/tsp_touchtype), Ubuntu 13.04 Raring Ringtail и Debian 7.0/wheezy.

Что работает:

  • позиционирование курсора к месту нажатия;
  • обработка удерживания (эмуляция удерживания левой кнопки мыши);
  • обработка двойного нажатия одним пальцем (эмуляция левой кнопки мыши);
  • обработка нажатия двумя пальцами (эмуляция правой кнопки мыши);
  • поворот координат сенсорного экрана.

Для этого нужно выполнить следующие шаги:

  • Установить дистрибутив через Linux Deploy (Debian или Ubuntu) и подключиться к консоли под пользователем root (например, по SSH).

  • Доставить необходимые пакеты:
    apt-get install build-essential wget unzip xorg-dev libmtdev-dev
    
  • Загрузить исходный код модифицированного драйвера mtev для Xorg:
    wget https://github.com/meefik/xorg-input-mtev/archive/master.zip --no-check-certificate
    unzip master.zip
    
  • Запустить сборку драйвера:
    cd ./xorg-input-mtev-master/
    make
    
  • Скопировать драйвер в каталог модулей Xorg:
    cp obj/mtev.so /usr/lib/xorg/modules/input/mtev_drv.so
    
  • Отредактировать файл /etc/X11/xorg.conf:
      Section "ServerLayout"
          Identifier "Layout0"
          Screen "Screen0"
          InputDevice "touchscreen" "CorePointer"
      EndSection
    
      Section "InputDevice"
          Identifier "touchscreen"
          Option "Device" "/dev/input/event2" #linuxdeploy
          Driver "mtev"
          Option "Rotation" "1"
      EndSection
    
      Section "Device"
          Identifier "Card0"
          Driver "fbdev"
          Option "fbdev" "/dev/graphics/fb0" #linuxdeploy
          Option "Rotate" "CW"
      EndSection
    
      Section "Screen"
          Identifier "Screen0"
          Device "Card0"
          DefaultDepth 24
          SubSection "Display"
              Depth 24
          EndSubSection
      EndSection
    
  • Запустить GNU/Linux через Linux Deploy в режиме фрейм-буфера (Параметры -> Графическая подсистема -> Framebuffer). Для набора текста можно использовать виртуальную клавиатуру florence.

Веб-терминал для Android

wShell - эмулятор терминала с веб-интерфейсом для Android. Основан на Shell In A Box. Приложение позволяет подключиться к консоли Android-устройства прямо из веб-браузера, если компьютер и устройства находятся в одной локальной сети.

wshell

Приложение распространяется под лицензией GPL версии 3 или более поздней.

Исходный код: https://github.com/meefik/wshell
Установить из Google play: https://play.google.com/store/apps/details?id=ru.meefik.wshell

Публикация в журнале ИУС № 5(66)/2013

В журнале Информационно-управляющие системы № 5(66)/2013 опубликована статья “Приложение для автоматизации процессов установки и запуска GNU/Linux-окружения на устройствах под управлением Android”, страницы 56-60.

linuxdeploy

В статье проводится обзор основных функций разработанного программного обеспечения для автоматизации установки GNU/Linux-дистрибутивов и запуска Linux-приложений на устройствах под управлением Android. Даны примеры его возможного использования, сравнение с аналогами. Описываются принципы работы программного обеспечения. Приведены оценка производительности и статистика по апробации.

Запуск дистрибутива OpenPandora

Через Linux Deploy под Android можно запустить дистрибутив OpenPandora.

Инструкция

  • В приложении Linux Deploy 1.4.1+ создать новый профиль и в параметрах указать следующее: Дистрибутив - RootFS; URL-адрес зеркала - http://www.openpandora.org/firmware/pandora-rootfs.tar.bz2; Тип установки - Файл; Путь установки - путь к будущему образу (например, /mnt/sdcard/pandora.img); Размер образа (МБ) - 1000 (можно больше); Имя пользователя - android, Окружение рабочего стола - Xfce; Установить GUI - нет. Остальные параметры менять не нужно.

  • Запустить установку через Параметры -> Установить. В результате должен быть создан файл образа диска на карте памяти и в него распакован архив rootfs.

  • Запустить SSH сервер (из консоли Android, можно использовать терминал ConnectBot):
    linuxdeploy shell "/etc/init.d/dropbear start"
    

    Теперь можно подключиться по SSH, логин - android, пароль - changeme, порт 22.

  • Остановить SSH сервер:
    linuxdeploy shell "/etc/init.d/dropbear stop"
    
  • Настройка автоматического запуска/остановки SSH через Android-интерфейс Linux Deploy (кнопками СТАРТ/СТОП):
    linuxdeploy shell "cp /etc/init.d/dropbear /etc/init.d/ssh"
    

Комментарий: Чтобы из консоли Android была доступна команда linuxdeploy нужно в настройках разрешить создавать в системе символьную ссылку (Настройки -> Создать симлинк) и обновить рабочее окружение (Настройки -> Обновить окружение). Однако это необязательное требование и можно вызывать команду linuxdeploy по полному пути ENV_DIR/bin/linuxdeploy, где ENV_DIR - каталог рабочего окружения, по умолчанию /data/data/ru.meefik.linuxdeploy/linux.

Запуск дистрибутива Angstrom

Через Linux Deploy под Android можно запустить дистрибутив Angstrom.

Инструкция

  • Создать образ системы (rootfs) в формате tar.gz на сайте narcissus.angstrom-distribution.org и получить ссылку на архив.

  • В приложении Linux Deploy 1.4.1+ создать новый профиль и в параметрах указать следующее: Дистрибутив - RootFS; URL-адрес зеркала - полученная ранее ссылка; Тип установки - Файл; Путь установки - путь к будущему образу (например, /mnt/sdcard/angstrom.img); Размер образа (МБ) - 100 (можно больше); Имя пользователя - android, Окружение рабочего стола - XTerm. Остальные параметры менять не нужно.

  • Запустить установку через Параметры -> Установить. В результате должен быть создан файл образа диска на карте памяти и в него распакован архив rootfs.

  • Установить необходимые пакеты и выполнить базовую конфигурацию. Для этого из любого Android-терминала выполнить (через программу ConnectBot или другой терминал, выполнять от рута):
    linuxdeploy shell "opkg update"
    linuxdeploy shell "opkg install initscripts sysvinit sysvinit-pidof shadow bash \
      localedef glibc-localedata-en-us glibc-localedata-ru-ru tzdata dropbear sudo \
      xserver-xorg-xvfb x11vnc xinit xterm"
    linuxdeploy configure
    
  • Запустить SSH сервер:
    linuxdeploy shell "/etc/init.d/dropbear start"
    

    Теперь можно подключиться по SSH: логин - android, пароль - changeme, порт 22.

  • Остановить SSH сервер:
    linuxdeploy shell "/etc/init.d/dropbear stop"
    
  • Запустить VNC сервер:
    linuxdeploy shell
    xinit /bin/su - android -c 'export DISPLAY=:0; ~/.vnc/xstartup' -- /usr/bin/Xvfb :0 -screen 0 800x400x16 -nolisten tcp -ac &
    su - android -c 'x11vnc -forever -display :0 -wait 10' &
    

    Теперь можно подключиться по VNC: пароль - changeme, порт 5900.

  • Остановить VNC сервер:
    pkill -9 Xvfb
    
  • Настройка автоматического запуска/остановки SSH через Linux Deploy (кнопками СТАРТ/СТОП):
    linuxdeploy shell "cp /etc/init.d/dropbear /etc/init.d/ssh"
    
  • Настройка автоматического запуска/остановки VNC через Linux Deploy (кнопками СТАРТ/СТОП):
    linuxdeploy shell
    cat << EOF > /usr/bin/vncserver
    #!/bin/sh
    [ $# -eq 0 ] && exit 1
    VNC_DISPLAY=$1
    shift
    while true
    do
      case $1 in
      -depth)
          VNC_DEPTH=$2; shift 2; continue
      ;;
      -geometry)
          VNC_GEOMETRY=$2; shift 2; continue
      ;;
      -dpi)
          VNC_DPI=$2; shift 2; continue
      ;;
      *)
          break
      ;;
      esac
    done
    if [ -n "$VNC_DEPTH" -a -n "$VNC_GEOMETRY" -a -n "$VNC_DPI" ]
    then
      Xvfb ${VNC_DISPLAY} -screen 0 ${VNC_GEOMETRY}x${VNC_DEPTH} -dpi ${VNC_DPI} -nolisten tcp -ac &
      x11vnc -forever -display ${VNC_DISPLAY} -wait 10 &
      sleep 1
      DISPLAY=${VNC_DISPLAY} ~/.vnc/xstartup &
    else
      pkill -9 Xvfb
    fi
    EOF
    chmod 755 /usr/bin/vncserver
    

Комментарий: Чтобы из консоли Android была доступна команда linuxdeploy нужно в настройках разрешить создавать в системе символьную ссылку (Настройки -> Создать симлинк) и обновить рабочее окружение (Настройки -> Обновить окружение). Однако это необязательное требование и можно вызывать команду linuxdeploy по полному пути ENV_DIR/bin/linuxdeploy, где ENV_DIR - каталог рабочего окружения, по умолчанию /data/data/ru.meefik.linuxdeploy/linux.

Настройка окружения рабочего стола GPE

Установка и настройка окружения рабочего стола, которого нет в списке настроек программы Linux Deploy, на примере GPE.

linuxdeploy

Для этого нужна установленная система, можно без окружения рабочего стола (в данном случае Debian Wheezy). Далее нужно подключиться к системе по SSH и выполнить установку окружения:

sudo apt-get update
sudo apt-get install tightvncserver x11-xserver-utils xfonts-base \
                     gpe --no-install-recommends -yq
sudo apt-get clean

После этого нужно настроить автозапуск:

mkdir ~/.vnc
chmod 755 ~/.vnc
echo "MPTcXfgXGiY=" | base64 -d > ~/.vnc/passwd
chmod 600 ~/.vnc/passwd
cat << EOF > ~/.vnc/xstartup
XAUTHORITY=\$HOME/.Xauthority
LANG=ru_RU.UTF-8
export XAUTHORITY LANG
echo \$\$ > /tmp/xsession.pid
matchbox-session
EOF
chmod 755 ~/.vnc/xstartup

После этих опрерация будет установлены VNC сервер и GPE, а также настроен автозапуск при старте VNC. Пароль к VNC будет: changeme

Запуск дистрибутива Raspbian MATE

Дистрибутив Raspbian MATE основан на Debian и разрабатывается для Raspberry Pi, в качестве окружения рабочего стола используется MATE. Этот дистрибутив можно запустить под Android через Linux Deploy.

linuxdeploy

Инструкция

  • Скачать образ с официального сайта: rpi_pisces_mate_r2.zip

  • Извлечь из полного образа образ третьего раздела (выполнять из-под Linux):
    kpartx -v -a rpi_pisces_mate_r2.img
    dd if=/dev/mapper/loop0p3 of=/tmp/rpi_pisces_mate.img bs=1M
    
  • Скопировать файл rpi_pisces_mate.img на карту памяти устройства.

  • В приложении Linux Deploy создать новый профиль и в параметрах указать: Дистрибутив - Debian; Версия дистрибутива - wheezy; Тип установки - Файл; Путь установки - путь к файлу rpi_pisces_mate.img; Имя пользователя - raspbian; Окружение рабочего стола - Другое. Выполнить переконфигурацию (Параметры -> Переконфигировать).

  • Запустить GNU/Linux кнопкой СТАРТ из главного окна приложения. Подключиться по SSH: логин - raspbian, пароль - changeme.

  • Настроить автозапуск окружения рабочего стола по VNC:
    cat << EOF > ~/.vnc/xstartup
    XAUTHORITY=\$HOME/.Xauthority
    LANG=ru_RU.UTF-8
    export XAUTHORITY LANG
    echo \$\$ > /tmp/xsession.pid
    mate-session
    EOF
    chmod 755 ~/.vnc/xstartup
    
  • Перезапустить GNU/Linux через интерфейс программы. Подключиться по VNC, пароль - changeme. Должен открыться рабочий стол MATE.

Запуск дистрибутива Bodhi Linux

Linux Deploy поддерживает запуск дистрибутива Bodhi Linux под Android.

linuxdeploy

Инструкция

  • Получить ссылку на rootfs архив Bodhi Linux.

  • В приложении Linux Deploy создать новый профиль и в параметрах указать следующее: Дистрибутив - RootFS; URL-адрес зеркала - полученная ранее ссылка (например, http://netcologne.dl.sourceforge.net/project/bodhilinux/ARMHF/rootfs/bodhi-rootfs-20130124.tar.gz); Тип установки - Файл; Путь установки - путь к будущему файлу образа (например, /mnt/sdcard/bodhi.img); Имя пользователя - android; Окружение рабочего стола - Другое. Выполнить установку (Параметры -> Установить). На данном этапе создается новый образ системы в который распаковывается архив rootfs.

  • После завершения установки снова зайти в параметры Linux Deploy и изменить следующее: Дистрибутив - Debian; Версия дистрибутива - wheezy; Архитектура - armhf; Окружение рабочего стола - Другое. Выполнить переконфигурацию (Параметры -> Переконфигурировать). На данном этапе выполняется установка GUI (SSH сервер, VNC сервер).

  • Запустить Linux кнопкой СТАРТ из главного окна приложения. Подключиться по SSH: логин - android, пароль - changeme.

  • Через SSH терминал настроить автозапуск окружения рабочего стола:
      cat << EOF > ~/.vnc/xstartup
      XAUTHORITY=\$HOME/.Xauthority
      LANG=ru_RU.UTF-8
      export XAUTHORITY LANG
      echo \$\$ > /tmp/xsession.pid
      enlightenment_start
      EOF
      chmod 755 ~/.vnc/xstartup
    
  • Доставить недостающие пакеты:
      sudo apt-get install locales openssh-server -yq
    
  • Перезапустить GNU/Linux через интерфейс программы. Подключиться по VNC, пароль - changeme. Должен открыться рабочий стол среды E17.

Настройка окружения рабочего стола Unity

Установка и настройка окружения рабочего стола, которого нет в списке настроек программы Linux Deploy, на примере Unity.

Для этого нужна установленная система Ubuntu 12.04 LTS, можно без окружения рабочего стола. Далее нужно подключиться к системе по SSH и выполнить установку окружения:

sudo apt-get update
sudo apt-get install tightvncserver x11-xserver-utils xfonts-base \
                     gnome-core unity-2d unity-common unity-lens-files \
                     unity-lens-applications unity-lens-music \
                     --no-install-recommends -yq
sudo apt-get clean

После этого нужно настроить автозапуск:

mkdir ~/.vnc
chmod 755 ~/.vnc
echo "MPTcXfgXGiY=" | base64 -d > ~/.vnc/passwd
chmod 600 ~/.vnc/passwd
echo 'XAUTHORITY=$HOME/.Xauthority' > ~/.vnc/xstartup
echo 'export XAUTHORITY' >> ~/.vnc/xstartup
echo 'gnome-session --session=ubuntu-2d &' >> ~/.vnc/xstartup
chmod 755 ~/.vnc/xstartup

После этих опрерация будет установлены VNC сервер и Unity, а также настроен автозапуск при старте VNC. Пароль к VNC будет: changeme