PixelのLinuxターミナル環境からDownload以外のディレクトリにアクセスできるようにしたい(sftp)
2025-08-03時点では、 /mnt/shared から /storage/emulated/0/Download にアクセスできるが、それ以外にアクセスできない。かなり物足りない。
LineageOS (Android15〜) だと、最初から /storage/emulated/0 が見られるらしい。いいな~
方法。Pixelターミナル側がVMなので、ターミナル側の自由は効く。
rclone mountまたはsshfsでTermux側にSSHつなぐ。
今回はrclone mountを使用
めっちゃ遅いうえ不安定だが、無いよりマシ
Termuxのホームディレクトリから小さなファイルを直列で読み込む場合、1秒で7ファイルくらいしか読めない
node_modules とかは現実的じゃなさそう
/mnt/shared は2GB/s出るが、ssh経由マウントは2~数十MB/sくらいしか出ない
結局、 /storage/emulated/0/Download/ 配下にフォルダ作って .nomedia 置いてそこを経由させたほうがよいかも
ただ Download 配下はパーミッション設定無いのがな〜
fioでベンチマーク走らせたらTermux側のsshdが落ちた
エラー内容
code:$PREFIX/var/log/sv/sshd/current
2025-08-11_19:08:05.69998 Read error from remote host fe80::b455:90ff:fea2:6625%avf_tap_fixed port 37890: Connection reset by peer
2025-08-11_19:08:05.71904 Connection closed by fe80::b455:90ff:fea2:6625%avf_tap_fixed port 37900
2025-08-11_19:08:05.73407 Connection closed by fe80::b455:90ff:fea2:6625%avf_tap_fixed port 37914
使い道は
Dockerでのmountなどを想定
ffmpegとかはTermuxで実行したほうがいい
以下、PixelのLinuxターミナル環境にtermuxからssh接続する設定を済ませている前提。
Termux側でsshdを用意
code:termux.sh
# インストール
pkg install openssh
# 設定
# ポート設定。ポート番号はランダムに、かつTermux側とLinuxターミナル側でそれぞれ被らないものにした方がいい
echo "Port 11112" > $PREFIX/etc/ssh/sshd_config.d/00-custom.conf
# 公開鍵認証を明示的に有効化
echo "PubkeyAuthentication yes" >> $PREFIX/etc/ssh/sshd_config.d/00-custom.conf
# パスワード認証を明示的に無効化
echo "PasswordAuthentication no" >> $PREFIX/etc/ssh/sshd_config.d/00-custom.conf
# ターミナル側でssh鍵を生成してなければ生成。コメントと質問回答はいい感じに
ssh vm 'ssh-keygen -t ed25519 -C "pixel-terminal"'
# authorized_keysを設定
ssh vm 'cat .ssh/id_ed25519.pub' >> ~/.ssh/authorized_keys
# サービス有効化かつ起動
sv-enable sshd
ターミナル側にrcloneをインストール
code:terminal.sh
# aptで入れる場合
sudo apt install rclone
# miseで入れる場合 (私はこっち)
mise use -g rclone
ターミナル側でtermuxにssh接続する設定
code:termux.sh
# termuxでのユーザ名とPREFIXを渡してssh接続
# id -un = id --user --name
ssh vm -t "TERMUX_USERNAME=$(id -un) TERMUX_PREFIX=$PREFIX bash"
code:terminal.sh
# rcloneを設定
rclone config create termux sftp host "$(echo $SSH_CONNECTION | cut -d" " -f1)" port 11112 user $TERMUX_USERNAME key_file ~/.ssh/id_ed25519
# 接続できることを確認 (ホームディレクトリ以下のディレクトリとファイルの一覧を表示)
rclone lsd termux:
# ユーザ権限でファイルマウント/アンマウントを行うためのFUSEをインストール
sudo apt install fuse3
# 以下フォルダが無いことを確認
ls /data
ls /storage
# マウントするパスを作成 (rclone mountでは、マウント用に空のディレクトリを作ってある必要がある)
# 内部ストレージ全体
sudo mkdir -p /storage/emulated/0
sudo chown -R $(id -u):$(id -g) /storage
# ホームディレクトリ
# termuxから同じパスで呼べると便利かもと思った 実際使うかは不明
sudo mkdir -p $TERMUX_PREFIX/home
sudo chown -R $(id -u):$(id -g) /data
# ホームディレクトリ2 指定が楽なほう
sudo mkdir -p /termux/home
sudo chown -R $(id -u):$(id -g) /termux
# マウント
rclone mount --daemon termux:/storage/emulated/0 /storage/emulated/0
rclone mount --daemon termux: $TERMUX_PREFIX/home
rclone mount --daemon termux: /termux/home
# マウントできたことを確認
ls /storage/emulated/0
ls $TERMUX_PREFIX/home
ls /termux/home
termuxからssh接続する度にマウント設定とマウントを行うようにする。
以下はtermuxの$PREFIXが/data/data/com.termux/files/usrの場合。
code:.ssh-mount-setup.sh
if "$SSH_CONNECTION" == *enp0s7* && ! -f /termux/home/.bash_history ; then
rclone config update termux host "$(echo $SSH_CONNECTION | cut -d" " -f1)" >/dev/null
rclone mount --daemon termux:/storage/emulated/0 /storage/emulated/0
rclone mount --daemon termux: /data/data/com.termux/files/usr/home
rclone mount --daemon termux: /termux/home
fi
# 他便利変数
export THOME=/termux/home
export TS0=/storage/emulated/0
上記ファイルを作って、 .bashrc とかに以下を追記。
code:sh
. ~/.ssh-mount-setup.sh
TODO
マウントされた内容にrootからアクセスできない
Permission Deniedになる
https://rclone.org/commands/rclone_mount/#rclone-as-unix-mount-helper を試す
パフォーマンステスト
fioの実行を成功させる
軽く見た感じ、 /mnt/shared は2GB/s出るが、ssh経由マウントは2~数十MB/sくらいしか出ない
参考
$SSH_CONNECTION について
PixelのLinuxターミナル環境からホスト(Android OS)側に接続するためのIPアドレスを取得
rcloneコマンドについて
rclone mount
rclone config create
#Pixelターミナル