z80oolong さんはインスタンス qiitadon.com のユーザーです。アカウントさえ持っていればフォローしたり会話したりできます。 もしお持ちでないなら こちら からサインアップできます。

z80oolong @z80oolong@qiitadon.com

## 結論

[pelya 氏][1]による libandroid-shmem.so と異なり、 [termux の開発コミュニティ][2]による libandroid-shmem.so は、関数 shmget(2) の第一引数 key に IPC_PRIVATE 以外の値を指定出来るために、 [termux の開発コミュニティ][2]による libandroid-shmem.so の導入によって Qt の共有メモリ関連のライブラリ関数を用いたソフトウェア等が Debian noroot 環境 で正常に動作し、また、他の共有メモリを使用したソフトウェアについても動作のパフォーマンスが向上したことが判りました。

[1]:github.com/pelya
[2]:termux.com/

(続き)
この動的ファイルを使用するには、まず最初に生成された動的ライブラリを Debian noroot 環境のルートディレクトリにインストールします。

# install -v -m 0755 libandroid-shmem-termux.so /

次に、 Debian noroot 環境の初期化ファイルである /proot.sh において、環境変数 LD_PRELOAD が定義されている行を以下のように修正します。

# LD_PRELOAD="... /libandroid-shmem.so ..."
LD_PRELOAD="... /libandroid-shmem-termux.so ..." # /libandroid-shmem.so を /libandroid-shmem-termux.so に修正。

初期化ファイル /proot.sh の修正後は、 Debian noroot 環境を再起動して設定を有効にします。

(続き)
そして、入手したソースコードが置かれているディレクトリに、以下のようにして、差分ファイル libandroid-shmem-termux-0.2_1-fix.diff を適用して通常通りに make コマンドによってコンパイルすると、動的ライブラリ libandroid-shmem-termux.so が生成されます。

$ patch -p1 < /path/to/diff/libandroid-shmem-termux-0.2_1-fix.diff
(ここに、 /path/to/diff は、 libandroid-shmem-termux-0.2_1-fix.diff が置かれているディレクトリのパス名)
$ make ... (オプションを適宜設定すること。)

## 差分ファイルの適用とソースコードのコンパイル

まず、 [termux の開発コミュニティ][2]による libandroid-shmem.so の github 版若しくは v0.2 版を以下の URL から入手し、 tarball の場合は適当なディレクトリに展開します。

- github.com/termux/libandroid-s
- github.com/termux/libandroid-s

次に、[termux の開発コミュニティ][2]による libandroid-shmem.so を Debian noroot 環境に再移植するための差分ファイルを以下の URL より入手します。

- gist.githubusercontent.com/z80

[2]:termux.com/

(続き)
しかし、 [pelya 氏][1]による
libandroid-shmem.so では、 Qt の共有メモリ関係のライブラリ関数を用いたソフトウエアが正常に動作しなかったり、その他の共有メモリを使用したソフトウェアの動作のパフォーマンスがあまり良くないという問題があります。

ここで、 Debian noroot 環境において、 [pelya 氏][1]による libandroid-shmem.so に代えて、 [termux の開発コミュニティ][2]によって改良された libandroid-shmem.so を導入することにより、Qt の共有メモリ関係のライブラリ関数を用いたソフトウエアの正常な動作や、その他の共有メモリを使用したソフトウェアの動作のパフォーマンスの向上を図ることが出来るようになりました。

[1]:github.com/pelya
[2]:termux.com/

# Termux 開発コミュニティによる libandroid-shmem.so を Debian noroot 環境に導入する

## はじめに

Debian noroot とは、 Android OS 上において root 権限を取ることなく Debian 環境を構築するためのアプリケーションです。

CPU の性能とメモリ容量が潤沢にある Android 端末であれば、 Debian noroot の導入によって Android 端末上で非常に軽快な Debian 環境を実現することができます。

[pelya 氏][1]によって作成された Debian noroot 環境には、共有メモリ関連の標準 C ライブラリ関数を /dev/ashmem によってエミュレートする Debian noroot 環境のための動的ライブラリである libandroid-shmem.so が導入されています。

[1]:github.com/pelya

この場合、ハードリンク元及びハードリンク先のファイルにアクセスしようとすると、Permission Denied のシステムコールエラーを発生して proot 環境下においてこれらのファイルの読み書きが完全に不可能となる場合があります。

この場合、問題となったファイルを削除するには、一旦 proot を link2symlink 機能を無効にして再起動する必要がありますので、ご注意下さい。

また、この問題の解決については、現在調査中ですのでどうか御了承下さい。

## ファイル .l2s.*, .l2s.*.0002 についての問題点

ここで、 proot 環境下において、ファイル .l2s.* 等は、一般ユーザの権限で書き込みや削除を行うことが可能であるため、これらのファイルをハードリンク元等のファイルより削除する操作を行った場合、実体を保持するファイルである .l2s.*.0002 等の場合は、ハードリンク元等のファイルの実体が失われることとなり、また、中間的なシンボリックリンクである .l2s.* の場合は、ハードリンク元の参照先を失うこととなります。

なお、この操作は、ハードリンクを作成したファイルを含むディレクトリを rm -rf コマンドで削除しようとした場合等に発生します。

2. 2回目以降に、ハードリンク元となるファイルからハードリンク先となるファイルにハードリンクを張る時、以下の処理が行われる。

- ハードリンク元となるファイルの実体のファイル名である .l2s.*.0002 の末尾の .0002 の数字を .0003 にインクリメントする。
- ハードリンク元となるファイルの実体のファイル .l2s.*.0003 に向けて、中間的なシンボリックリンク .l2s.* を張り直す。
- 中間的なシンボリックリンク .l2s.* に向けて、ハードリンク先となるファイル名にシンボリックリンクを張る。

3. proot による chroot 環境下においては、 1. 及び 2. で示された過程で作成されたシンボリックリンクが擬似的にハードリンクとして扱われる。

上記の事から判るように、ハードリンク元及びハードリンク先のファイルは、中間的なシンボリックリンク .l2s.* を経由して実体となるファイル .l2s.*.0003 を参照している事が判ります。

1. 1回目に、ハードリンク元となるファイルからハードリンク先となるファイルにハードリンクを張る時、以下の処理が行われる。

- ハードリンク元となるファイルの実体のファイル名が .l2s.*.0002 で始まるファイル名に変更される。
- ハードリンク元となるファイルの実体のファイル .l2s.*.0002 に向けて、中間的なシンボリックリンク .l2s.* を張る。
- 中間的なシンボリックリンク .l2s.* に向けて、ハードリンク元及びハードリンク先となるファイル名にシンボリックリンクを張る。

## proot の link2symlink 機能の動作原理

ここで、 Qiita の投稿 "[Debian noroot 環境において link2symlink 機能を実装した proot を導入する][1]" における "[proot の動作確認][2]" の章で述べた proot の link2symlink 機能の動作原理について下記に再掲します。

0. link2symlink 機能を実装した proot の子プロセスよりシステムコール link(2) が実行されると、 proot によってこれがフックされ、以下の処理が行われる。

[1]:qiita.com/z80oolong/items/20a1
[2]:qiita.com/z80oolong/items/20a1

# link2symlink 機能を実装した proot についての注意点

## 概要

termux の開発コミュニティによる link2symlink 機能を実装した proot について、下記のようにファイル foo から foo1 にハードリンクを張ると、 proot の内部で、 .l2s. で始まるファイルが作成されます。

$ cd ./test
$ ln foo foo1
$ ls -a
.l2s.foo0000.0002 .l2s.foo0000 foo foo1
...

これらのファイルは、ファイル foo, foo1 から張られる中間のシンボリックリンク及び foo, foo1 の実体となるファイルです。

これらのファイルは、一般ユーザから書き込みや削除が可能であり、これらのファイルをファイル foo, foo1 より先に削除した場合、 foo, foo1 のアクセスに著しい障害が発生する可能性があるので注意が必要です。

## Debian noroot 環境の再起動

/startx.sh を変更した後、 Debian noroot 環境を再起動すると、 ratpoison が使用出来るようになります。

## 設定の変更

パッケージ ratpoison をインストールした後は、以下のように、Debian noroot 環境の起動スクリプトである /startx.sh において、  xfce-session コマンドを起動している行を ratpoison コマンドを起動するように書き換えます。

...(略)...

sleep 1
#dbus-launch --exit-with-session sh -c 'xfce4-session ; setsid sh -c "cd /proc/ ; for f in [0-9]* ; do [ \$f = \$\$ ] || kill -9 \$f ; done"' &
dbus-launch --exit-with-session sh -c 'ratpoison ; setsid sh -c "cd /proc/ ; for f in [0-9]* ; do [ \$f = \$\$ ] || kill -9 \$f ; done"' & wait

## ratpoison の導入

軽量のタイル型ウィンドウマネージャ ratpoison は、コマンドライン上から apt-get コマンドを用いて、以下のようにして導入することが出来ます。

$ sudo apt-get install ratpoison

# Debian noroot 環境に ratpoison を導入する

## はじめに

Debian noroot とは、 Android OS が動作する携帯端末において root 権限を取ることなく Debian 環境に基づいたデスクトップ環境を構築するためのアプリケーションです。

Debian noroot 環境を5 インチから 6 インチ未満程度の画面の Android OS 搭載のスマートフォン端末で動作させると、 Linux のソフトウェアのインターフェースについて視認性に問題が発生する事があります。

ここで、軽量なタイル型ウィンドウマネージャである ratpoison を Debian noroot 環境に導入することで、小画面の Android OS 端末においても、 Linux のソフトウェアを全画面で起動することが出来、また、 ratpoison は、物理キーボードを用いたウィンドウの操作において GNU screen 等と親和性が高いため、 Debian noroot 環境において、高い視認性と軽快で快適な操作性を実現することが出来ます。

## Debian noroot 環境を起動する

そして、下記の画面のように、設定変更のメニューから [OK] の項目を選択すると、 Debian noroot 環境が起動します。

Debian noroot 環境の起動後は、変更したキーを押下げて、設定の通りに物理キーボードから入力が行われる事を確認します。

但し、 CapsLock キーの挙動については、場合によっては xmodmap 若しくは setxkbcomp に基づく設定も必要となる場合がある事に留意して下さい。

## 設定変更のメニューを表示させる

前節の画面が表示されたら、**Debian noroot 環境が起動する直前に、画面上部の [CHANGE DEVICE CONFIGURATION] のボタンをタップします。**

すると、下記の1枚目の画面のように Debian noroot アプリの各種設定を変更するためのメニューが表示されます。

## 物理キーボードの押し下げ動作の設定を変更する

そして、設定変更のメニューから、 [Remap physical keys] の項目を選択します。 すると、下記の2枚目の画面のように、押下げ時の動作を変更したいキーの選択を促す画面が表示されます。

ここで、動作を変更したいキー (例えば、 CapsLock キー) を押下げると、下記の3枚目の画面のように、押下げ時のキーの動作を選択するメニューが表示されます。

そして、押下げ動作を選択するメニューから、押下げ時の動作 (例えば LCTRL = 左 Ctrl キーの動作) を選択すると、再度下記の1枚目の画面に戻ります。

# Debian noroot 環境における物理キーボード配列の設定手法

Debian noroot 環境において bluetooth 接続の物理キーボードを使用する場合、 CapsLock キーを誤って押さないように、 CapsLock キーを Cntl キーに設定したり、 capsLock キーと Cntl キーの押し下げ動作を交換したい場合があります。

このような場合、通常の Linux ディストリビューションでは、 xmodmap 若しくは setxkbcomp に基づく設定を行うのが一般的ですが、 Debian noroot 環境の場合は、 Debian noroot アプリの初期起動時に物理キーボードの押し下げ動作に関する設定を行うことが出来ます。

これは、前述したように、CapsLock キーを Cntl キーに設定する等の簡易な物理キーボードの設定に有効です。

## Debian noroot アプリを起動する

まず最初に、 Android OS が動作する端末より、下記画面のように Debian noroot アプリを起動します。

## その他の注意点について (2 の追記)

前節の "その他の注意点について (2)" において述べた、 SD カードを「アプリとデータ用内部ストレージとして使用する」設定でフォーマットした場合に、ディレクトリ /storage/emulated/0 以下 (即ち、複数のアプリが共用する "内蔵外部ストレージ領域") にマウントすることが出来無い問題に関する件ですが、 Debian noroot アプリに「ストレージにアクセスする権限」を与えることで、マウントすることが可能になりました。

即ち、端末の設定において、

[設定]→[アプリ]→[Debian]→[権限]

の順に進んで、 [ストレージ] 権限の on/off を on にすることで問題が解決することが判りました。

この権限の設定は、Debian noroot のインストール時の初期状態では off となっているので注意が必要です。

### 再追記

この問題はどう見ても Android 6.0 以降のアプリの権限設定の機能を見落としていたのが原因でした (修行が足りないな、自分)。