Androidでsshの他に色々と試したかったのでTermuxにprootのUbuntuを入れたときのメモ。
1. Termuxの入手とUbuntuのインストール
メインの流れはここ(【簡易版:Androidのブラウザで実現するpython環境】機械学習(pytorch, scikit-learn)や実用的なプログラミング(jupyterlab, pandas, matplotlib, strearmlit)の環境構築について)を参考にした。
1.1. F-DroidからTermuxを入手
F-Droid版のTermuxを入手。このときのTermuxはバージョン0.118.0(118)。
Termuxをインストールしたら、以下のコマンドを実行。
$ pkg update -y
$ pkg upgrade -y
$ termux-setup-storage # Termux上では /data/data/com.termux/files/home/storage
$ pkg install proot -y
$ pkg install proot-distro -y
$ proot-distro install ubuntu
地域と言語の設定
# apt update
# apt upgrade -y
# apt install locales -y
# apt install vim -y
# vim /etc/locale.gen # ja_JP.UTF-8のコメントアウト(#)を外す
# locale-gen
# update-locale LANG=ja_JP.UTF-8
# apt install tzdata
一般ユーザーの追加(u305fはユーザー名)
# apt install adduser
# adduser u305f
sudo権限の付与
# apt install sudo -y
# gpasswd -a u305f sudo
# cat /etc/group | grep sudo
# visudo
u305f ALL=(ALL:ALL) ALL # この内容を追記(u305fはユーザー名)
xonshを入れておく(optional)
# apt install xonsh
Ubuntuを出て、Termuxの.bashrcに自動ログイン用のコマンドを書き込み
# exit
$ echo 'proot-distro login --user u305f ubuntu' >> ~/.bashrc
$ exit
1.4. 一般ユーザーの環境を設定
Termuxを再起動すると一般ユーザーでUbuntuにログインする。まずは言語環境の設定。
# bash用
$ echo 'export LANG=ja_JP.UTF-8' >> ~/.bashrc
$ echo 'export LANGUAGE=ja_JP:ja' >> ~/.bashrc
$ echo 'export SCREENDIR=$HOME/.screen' >> ~/.bashrc
# xonshは以下の内容を.xonshrcに書き込む(echoだと環境変数が代入されてしまう…)
$LANG = 'ja_JP.UTF-8'
$LANGUAGE = 'ja_JP:ja'
$SCREENDIR '=$HOME/.screen'
$PROMPT = '{WHITE}[{BLUE}{user}{WHITE}@{hostname}:{#E26B4F}{cwd}{WHITE}]{#E9A963}$ ' # 自分の好みで設定
xonshをログインシェルとして使う場合は一般ユーザーで以下を実行しておく。
$ chsh -s $(which xonsh)
Androidにsshで接続できるようにするとコマンド入力など諸々が楽になる。「termuxでssh」や「TermuxでSSH Serverを起動する」を参考にして設定できるが、一度接続して満足して以降は使わなくなったので説明を省略する。
メインの流れはここ(TermuxにubuntuをインストールしてPythonを導入する)を参考にした。デフォルトで入るpython3とpipはエラーが発生して正しく動かないのと、miniforgeは全く使えないので自分でPythonをビルドする。今回はPython-3.12.2を使用。スマートフォンやタブレットの性能が貧弱だとビルドに1日くらいかかる。
# ビルドに必要なパッケージをインストール
$ sudo apt install build-essential libbz2-dev libdb-dev libreadline-dev libffi-dev libgdbm-dev liblzma-dev libncursesw5-dev libsqlite3-dev libssl-dev zlib1g-dev uuid-dev tk-dev
# https://www.python.org/ftp/python/3.12.2/からダウンロード
$ wget https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tar.xz
$ tar xJf Python-3.12.2.tar.xz
$ cd Python-3.12.2
$ ./configure
$ make
$ sudo make install
# インストールを確認
$ which python3
$ which pip
これでpython3とpipが使えるようになる。
3. Jupyterlabの導入
あとは普通にpipでJupyterlabをインストール。pip3を使用することに注意。
$ pip3 install jupyterlab jupyterlab-language-pack-ja-JP numpy scipy pandas matplotlib seaborn
Rの環境も整備する。
$ sudo apt install r-base -y
# JupyterlabでRを使えるようにする。
$ sudo apt install libzmq3-dev libcurl4-openssl-dev libssl-dev jupyter-core jupyter-client -y
$ R
> install.packages('IRkernel')
> IRkernel::installspec()
Jupyterの拡張機能を色々使うためにNode.jsをインストール
$ sudo apt install nodejs npm
4. Jupyterlabの実行
これで動く!(はず)
$ jupyter lab
5. ターミナルの見た目の変更など(optional)
bashやxonshの設定だとなかなかうまく見た目を(思ったように)調整できないので、Starshipを使ってプロンプトをカスタマイズする。
5.1. Nerd fontsの導入
Nerd fontsからプロンプトの表示のための好みのフォントをダウンロードする。
$ wget https://github.com/ryanoasis/nerd-fonts/releases/download/v3.1.1/UbuntuMono.zip
$ unzip UbuntuMono.zip
$ cp ~/UbuntuMono/UbuntuMonoNerdFontMono-Regular.ttf .termux/font.ttf
フォントのサイズは「Set Termux font size through command line」の以下のコメントにある通りにすれば変更できる。
Maybe not what you want, because not a scriptable command, but you can use keys: ctrl alt-
and ctrl alt +
(actually =
; you needn't shift it).
「【初心者向け】超簡単に黒い画面をカラフルにする方法〜Starship〜」の方法に従ってStarshipを導入する。
$ curl -sS https://starship.rs/install.sh | sh
bashの場合は以下を実行。
$ echo 'eval "$(starship init bash)"' >> ~/.bashrc
xonshの場合は以下を.xonshrcに追加する。
$ execx($(starship init xonsh))
シェルを起動し直すか、sourceで設定ファイルを読み込み直せばStarshipが起動する。
5.3. カスタマイズ
Starshipの設定ファイルを作成する。
$ mkdir ~/.config
$ touch ~/.config/starship.toml
プリセットを読み込んでも良い。
$ starship preset gruvbox-rainbow -o ~/.config/starship.toml
Termuxではcondaの仮想環境が使用できないので、そのままで良い。PCではconda環境を表示できるようにした以下のstarship.tomlを使用している。
"$schema" = 'https://starship.rs/config-schema.json'
format = """
[](color_orange)\
$os\
$username\
[](bg:color_yellow fg:color_orange)\
$conda\
$directory\
[](fg:color_yellow bg:color_aqua)\
$git_branch\
$git_status\
[](fg:color_aqua bg:color_blue)\
$c\
$rust\
$golang\
$nodejs\
$php\
$java\
$kotlin\
$haskell\
$python\
[](fg:color_blue bg:color_bg3)\
$docker_context\
[](fg:color_bg3 bg:color_bg1)\
$time\
[ ](fg:color_bg1)\
$line_break$character"""
palette = 'gruvbox_dark'
[palettes.gruvbox_dark]
color_fg0 = '#fbf1c7'
color_bg1 = '#3c3836'
color_bg3 = '#665c54'
color_blue = '#458588'
color_aqua = '#689d6a'
color_green = '#98971a'
color_orange = '#d65d0e'
color_purple = '#b16286'
color_red = '#cc241d'
color_yellow = '#d79921'
[os]
disabled = false
style = "bg:color_orange fg:color_fg0"
[os.symbols]
Windows = ""
Ubuntu = ""
SUSE = ""
Raspbian = ""
Mint = ""
Macos = ""
Manjaro = ""
Linux = ""
Gentoo = ""
Fedora = ""
Alpine = ""
Amazon = ""
Android = ""
Arch = ""
Artix = ""
CentOS = ""
Debian = ""
Redhat = ""
RedHatEnterprise = ""
[username]
show_always = true
style_user = "bg:color_orange fg:color_fg0"
style_root = "bg:color_orange fg:color_fg0"
format = '[ $user ]($style)'
[directory]
style = "fg:color_fg0 bg:color_yellow"
format = "[ $path ]($style)"
truncation_length = 3
truncation_symbol = "…/"
[conda]
symbol = ""
style = "bg:color_blue"
format = '[[ $symbol( $environment): ](fg:color_fg0 bg:color_yellow)]($style)'
[directory.substitutions]
"Documents" = " "
"Downloads" = " "
"Music" = " "
"Pictures" = " "
"Developer" = " "
[git_branch]
symbol = ""
style = "bg:color_aqua"
format = '[[ $symbol $branch ](fg:color_fg0 bg:color_aqua)]($style)'
[git_status]
style = "bg:color_aqua"
format = '[[($all_status$ahead_behind )](fg:color_fg0 bg:color_aqua)]($style)'
[nodejs]
symbol = ""
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'
[c]
symbol = " "
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'
[rust]
symbol = ""
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'
[golang]
symbol = ""
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'
[php]
symbol = ""
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'
[java]
symbol = " "
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'
[kotlin]
symbol = ""
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'
[haskell]
symbol = ""
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'
[python]
symbol = ""
style = "bg:color_blue"
format = '[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)'
[docker_context]
symbol = ""
style = "bg:color_bg3"
format = '[[ $symbol( $context) ](fg:#83a598 bg:color_bg3)]($style)'
[time]
disabled = false
time_format = "%R"
style = "bg:color_bg1"
format = '[[ $time ](fg:color_fg0 bg:color_bg1)]($style)'
[line_break]
disabled = false
[character]
disabled = false
success_symbol = '[](bold fg:color_green)'
error_symbol = '[](bold fg:color_red)'
vimcmd_symbol = '[](bold fg:color_green)'
vimcmd_replace_one_symbol = '[](bold fg:color_purple)'
vimcmd_replace_symbol = '[](bold fg:color_purple)'
vimcmd_visual_symbol = '[](bold fg:color_yellow)'