1. はじめに
前回の記事で、Termuxを起動してからVirtualBoxを起動して、リポジトリ操作がそれからになるのはなんか手間だなと感じていました。じゃあ、Termuxの起動時にrcloneのマウントもさせてしまえばいいじゃない、という謎の着想を得たので試してみます。
本記事では、クライアントに Linux Mint 22.2 Cinnamon Edition を使用します。
( Windows 11 は一部の作業手順のみ記載しています。)
2. 今回のテーマ
2.1 リポジトリの自動マウント
SSH接続する際、接続先でコマンドを実行させるスクリプトの書き方があるらしいです。今回はそれを頼りに、Termuxを起動したらクライアントPCにスマホのストレージがマウントされる動作を目指します。以下は今回のイメージ図です。
2.2 HTTP経由での接続
HTTP経由で接続する主な目的は以下の3点です。クライアント側で警告が出るらしいので、どの程度煩わしいものなのかは実際に運用して確認します。
- SVNコミット時の作者名をコントロールしたい
- リモートのURLを環境によらず統一したい
- サーバ証明書関連の作業を減らしたい
なお、本記事では言葉での作業説明を省いて、必要な情報を列挙する形にしてみます。
3. 自動マウントのセットアップ
3.1 ソフトウェアのインストール
ソフトウェアマネージャからインストールします。
Openssh-server
Rclone
Apache2
Git
Subversion
Windows環境ではサーバ構築せずに運用します。rcloneは以下のパスに配置して環境変数に追加するのがおすすめです。
C:\Users\ユーザ名\AppData\Local\Programs\rclone
rclone - https://rclone.org/downloads/
WinFSP - https://github.com/billziss-gh/winfsp/releases
3.2 Termuxの初期設定
スマホ画面からポチポチと入力します。
(*) Single mirror Choose a Single mirror to use
(*) mirrors.krnk.org Mirror by KuronekoServer, hosted in Tokyo, Japan
pkg upgrade
pkg install openssh
passwd
whoami
sshd
3.3 SSHの接続設定
クライアントPCからTermuxに接続します。
Host termux-ssh
HostName 192.168.x.x
User u0axxx
Port 8022
IdentityFile ~/.ssh/id_ed25519
ssh-keygen -t ed25519 -C "$(hostname)"
cat ~/.ssh/id_ed25519.pub
ssh u0axxx@192.168.x.x -p 8022
# id_ed25519.pub の中身をコピペ
ssh termux-ssh
TermuxからクライアントPCに接続します。
Host client-ssh
HostName 192.168.x.x
User ユーザ名
Port 22
IdentityFile ~/.ssh/id_ed25519
ConnectTimeout 5
ssh-keygen -t ed25519 -C デバイス名
cat ~/.ssh/id_ed25519.pub
# id_ed25519.pub の中身をコピペ
ssh client-ssh
3.4 シンボリックリンクの作成
スマホのストレージへのシンボリックリンクを作成します。
termux-setup-storage
ls -l ~/storage/external-1
ln -s /storage/xxxx-xxxx ~/storage/sdcard
ln -s ~/storage/shared ~/media
# ln -s ~/storage/sdcard ~/media
# ln -s ~/storage/shared ~/vault
ln -s ~/storage/external-1 ~/vault
# ln -s ~/storage/sdcard ~/vault
mkdir ~/vault/.vault
3.5 rcloneのリモート設定
rcloneでのリモート接続の準備をします。
[termux-sftp]
- type: sftp
- host: 192.168.x.x
- user: u0axxx
- port: 8022
- key_file: ~/.ssh/id_ed25519
[termux-vault]
- type: crypt
- remote: termux-sftp:vault/.vault
- password: *** ENCRYPTED ***
- #user_allow_other
+ user_allow_other
sudo mkdir -p /mnt/media
sudo mkdir -p /mnt/vault
sudo mkdir -p /srv/git
sudo mkdir -p /srv/svn
sudo chown "$USER:$USER" /mnt/media
sudo chown "$USER:$USER" /mnt/vault
sudo chown "$USER:$USER" /srv/git
sudo chown "$USER:$USER" /srv/svn
3.6 スクリプトの作成
自動マウントのスクリプトを作成します。
if [[ ! $SSH_CONNECTION ]]; then
termux-wake-lock
sshd
ssh client-ssh '
rclone mount termux-sftp:media /mnt/media \
--vfs-cache-mode writes --daemon
rclone mount termux-vault: /mnt/vault \
--vfs-cache-mode writes --daemon
rclone mount termux-vault:git /srv/git \
--uid 33 --gid 33 --allow-other \
--vfs-cache-mode writes --daemon
rclone mount termux-vault:svn /srv/svn \
--uid 33 --gid 33 --allow-other \
--vfs-cache-mode writes --daemon
'
else
USER=termux
HOSTNAME=デバイス名
PS1="\[\e]0;$USER@$HOSTNAME: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]$USER@$HOSTNAME\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ "
fi
if [[ ! $SSH_CONNECTION ]]; then
ssh client-ssh '
fusermount -u /mnt/media
fusermount -u /mnt/vault
fusermount -u /srv/git
fusermount -u /srv/svn
'
pkill sshd
termux-wake-unlock
fi
Windows環境では手動でマウントします。
mkdir "C:\mnt" -Force
Start-Process -WindowStyle Hidden -FilePath rclone `
-ArgumentList 'mount termux-sftp:media "C:\mnt\media" --vfs-cache-mode writes'
Start-Process -WindowStyle Hidden -FilePath rclone `
-ArgumentList 'mount termux-vault: "C:\mnt\vault" --vfs-cache-mode writes'
Stop-Process -Name rclone -Force
4. HTTPサーバのセットアップ
4.1 Gitサーバの設定
認証ユーザを設定します。初回のみ -cm オプションです。
sudo htpasswd -cm /etc/apache2/.htpasswd ユーザ名
sudo htpasswd -m /etc/apache2/.htpasswd ユーザ名
.conf ファイルを作成して、モジュールを有効化します。
# <VirtualHost *:443>
<VirtualHost *:80>
# ServerName client.home.arpa
ServerName localhost
# SSLEngine on
# SSLCertificateFile /etc/ssl/certs/client.crt
# SSLCertificateKeyFile /etc/ssl/private/client.key
SetEnv GIT_PROJECT_ROOT /srv/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
<Directory /usr/lib/git-core>
Options +ExecCGI
Require all granted
</Directory>
<Location /git>
AuthType Basic
AuthName "Git Repository"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Location>
</VirtualHost>
sudo a2enmod cgi
sudo a2ensite git.conf
sudo systemctl restart apache2
クライアントのユーザ設定を追加します。
git config --global init.defaultBranch main
git config --global user.name "$(hostname)"
git config --global user.email user@example.com
git config --global credential.helper store
Windows環境では credential.helper が設定済みです。
git config --global init.defaultBranch main
git config --global user.name "$(hostname)"
git config --global user.email "user@example.com"
4.2 Gitリポジトリの作成
Gitのベアリポジトリを作成します。以下のURLでアクセスできます。
mkdir -p /mnt/vault/git/my-first-git
cd /mnt/vault/git/my-first-git
git init --bare
http://localhost/git/my-first-git
client-ssh:/mnt/vault/git/my-first-git
ssh://client-ssh/mnt/vault/git/my-first-git
file:///mnt/vault/git/my-first-git
HTTP接続はPOSTサイズが制限を受けます。ご注意ください。
4.3 メディアフォルダのGit管理
メディアフォルダ用のリポジトリを作成して、自動更新を仕込みます。
mkdir -p /mnt/vault/git/media
cd /mnt/vault/git/media
git init --bare
cd /mnt/media
git init
git remote add origin http://localhost/git/media
git config --local user.name デバイス名
/*
!/.gitignore
!/DCIM/
!/Movies/
.tmfs/
.thumbnails/
git add -A
git commit -m "Initial commit"
git push -u origin main
ssh client-ssh '
export LANG=en_US.UTF-8
cd /mnt/media && \
git remote get-url origin && \
git pull && \
git add -A && \
git commit -m "Auto commit" && \
git push
exit 0
'
4.4 SVNサーバの設定
.conf ファイルを修正して、モジュールを有効化します。
sudo apt install libapache2-mod-svn
- #<Location /svn>
+ <Location /svn>
- #DAV svn
+ DAV svn
- #SVNParentPath /var/lib/svn
+ SVNParentPath /srv/svn
- #AuthType Basic
- #AuthName "Subversion Repository"
- #AuthUserFile /etc/apache2/dav_svn.passwd
+ AuthType Basic
+ AuthName "Subversion Repository"
+ AuthUserFile /etc/apache2/.htpasswd
#<LimitExcept GET PROPFIND OPTIONS REPORT>
- #Require valid-user
+ Require valid-user
#</LimitExcept>
- #</Location>
+ </Location>
sudo a2enmod dav
sudo a2enmod dav_svn
sudo systemctl restart apache2
4.5 SVNリポジトリの作成
SVNのリポジトリを作成します。以下のURLでアクセスできます。
mkdir -p /mnt/vault/svn
svnadmin create /mnt/vault/svn/my-first-svn
http://localhost/svn/my-first-svn
http://コンピュータ名/svn/my-first-svn
svn+ssh://client-ssh/mnt/vault/svn/my-first-svn
file:///mnt/vault/svn/my-first-svn
HTTP以外の接続では、コミット時の作者名がログインユーザ名で固定となります。
4.6 メディアフォルダのSVN管理
メディアフォルダ用のリポジトリを作成して、自動更新を仕込みます。
mkdir -p /mnt/vault/svn
svnadmin create /mnt/vault/svn/media
cd /mnt/media
svn checkout http://localhost/svn/media . --force --username デバイス名
svn add --depth=empty DCIM
svn add --depth=empty Movies
svn propset svn:ignore ".tmfs" DCIM
svn propset svn:ignore ".thumbnails" Movies
svn add --force DCIM
svn add --force Movies
svn commit -m "Initial commit"
ssh client-ssh '
export LANG=en_US.UTF-8
cd /mnt/media && \
svn info --show-item url && \
svn update && \
svn add --force DCIM && \
svn add --force Movies && \
svn commit -m "Auto commit"
exit 0
'
5. おわりに
FUSEマウント越しのSVNリポジトリ操作は、いまいち安定しない感じです。暗号化フォルダでのリポジトリ運用は、現実的にはGit一択かな。Copilotが「HTTP接続では警告が」とか言ってた割に、警告らしい警告もまるで見当たらないのですがそれは。
| ◀️ 前の記事 | 次の記事 ▶️ |
|---|---|
| セキュアサーバに、なりたいな「ハイ!rclone crypt」⑥サーバ構成を改変してみる | PCツナイデント(パラレル版)はDUALSHOCK 2接続IFとして2026年も健在です。 |