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)。
1.2. Ubuntuをインストール
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
1.3. 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を起動する」を参考にして設定できるが、一度接続して満足して以降は使わなくなったので説明を省略する。
2. Pythonの自力ビルド
メインの流れはここ(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-
andctrl alt +
(actually=
; you needn't shift it).
5.2. Starshipの導入
「【初心者向け】超簡単に黒い画面をカラフルにする方法〜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)'