メモのページ - チラシの裏メモ 3枚目

通信技術や気になった事を黙々とメモし続ける

AndroidスマホでAlpine Linuxを動かす

AndroidアプリにVirtualBoxのようなツール「Limbo PC Emulator」が有る。
学習用に使用していたAndoridタブレットの故障に伴い、普段使用しているAndroidスマホにLimbo PC Emulatorをインストールし、軽量なLinuxディストリビューションのうちの1つであるAlpine Linuxをデプロイしてみた。


Alpine Linuxとは
Alpine Linuxは、BusyBoxとmusl libcをベースとした、軽量なLinuxディストリビューションである。
init(プロセスを制御するプログラム)はOpenRCが採用され、UbuntuやRedhat LinuxやDebian GNU/Linux等主要はLinuxディストリビューションとは異なり、systemdを利用していない。
セキュアでシンプル、そして小さなカーネルはリソースの効率が良い為、Dockerイメージを作成するのに最適なだけでなく、サーバ用途としても充分に使える。
パッケージ管理システムはApline Linux独自のAPK(Alpine linux Package Management)が採用されている。
デフォルトのシェルはashだが、bashや他のシェルに変更する事は可能である。


何故スマホ上でAlpine Linux?
スマホでLinux...とは言うもののAndroid OSのカーネルはLinux OSをベースとしている為、AndroidスマホでAlpine Linuxを動作させるとLinuxの上でLinuxを動かしている感じになる点はご愛敬。
・電車車内での学習環境。AWSやAzure、自宅サーバとは異なりスマホが全く通信出来ない状態であっても操作する事が出来る。
・本当はCentOS Atomic Hostというコンテナ環境向けの物を導入したかったが、動作はするもののフォントサイズの変更が出来なかった為に断念。
・HP2133という小さなノートPCにCentOS7を入れて運用していたが、稼働時の高熱とFANの音に嫌気をさしAlpine Linuxに逃げた。
・デプロイやFTPサーバ構築完了の段階で.qcow2ファイルのサイズは300MB前後。動作に必要なRAMは256MBで充分。軽量なLinuxディストリビューション。
・どんなにプレイ(導入・カスタマイズ・運用...)しても課金されないスマホゲームといった感じか。ただし通信費は別。


当方の環境
・スマホ(ホスト機):SONY Xperia XZ2 / Android OS 9
・ホスト機の通信環境:WLANと4G回線
・エミュレータ:Limbo PC Emulator 2.10.0
・ゲストOS:alpine-virt-3.11.5-x86_64.iso
・ソフトウェアキーボード:Androidアプリの「Hacker's Keyboard」

Limbo PC Emulatorに似たようなアプリとしてUserLAndが挙げられるが、UserLAndとは異なりssh接続不要で、VirtualBoxやVMWare Workstationのようにコンソール画面で直接コマンドを叩く事が出来る。
Limbo PC EmulatorとHacker's Keyboardは予めインストールしておく。入手先は下記のリンク先を参照。
https://sourceforge.net/projects/limbopcemulator/ Limbo PC Emulator
https://play.google.com/store/apps/details?id=org.pocketworkstation.pckeyboard&hl=ja Hacker's Keyboard

Alpine Linuxのisoファイルは予めAndroid端末にダウンロードしておく。
下記のダウンロードサイト内の「VIRTUAL」欄にあるx86もしくはx86_64を選択し.isoファイルをダウンロード。
https://alpinelinux.org/downloads/


Limbo PC Emulatorの設定
Limbo PC Emulatorはインストールの完了後、すぐに使用が可能。Androidのroot化は不要。
デプロイの最初の工程は、Limbo PC Emulator側の設定から。

CPU/Board
Architecture:x86_64
Machine Type:pc
CPU Model:qemu64 もしくはDefault
CPU Cores:1
RAM Memory (MB):256

64bit版のAlpine Linuxを使用。Architectureのx86_64以外はデフォルト設定でもデプロイは完了し普通に動作する。
CPU Coresを2に設定しても、デプロイに要する時間ややコマンド実行時の出力時間はCPU Cores 1の時と殆ど変化が無い。
RAM MemoryはGUIを使用しないのであれは256MBで充分。

Storage
Hard Disk A:setup-alpineのインストール先につき必ず設定する。
HDDの名称な任意の文字列でOKだが、自分の環境ではisoファイルのファイル名をそのまま流用。
デプロイの完了後、ここで設定したファイル名.qcow2のファイルが生成される。
また、他の.qcow2ファイルを流用したい場合はここで指定する。

Removable Storage
CDROM:にAlpine Linuxのisoファイルを選択する。
今回の場合、alpine-virt-3.11.5-x86.isoとなる。

Graphics
VGA Display:vmware またはstd
vmwareを選択すると、Limbo PC Emulatorの画面のColor Modeの選択が可能になる。

Audio
Sound Card:None
CLIのみの運用、且つ利用目的がFTPサーバである為にAudioは不要。

Network
Network:User
Network Card:ne2k_pci、virtioのどちらに設定しても外部との通信は可能だが、Limbo PC EmulatorのみならずVirtualBox等のツールのゲストOSとしてデプロイするのであればVIRTUAL版(ファイル名にvirtioが付いているもの)が望ましい。
DNS Server:8.8.8.8のまま

Boot Settings
Boot from Device:最初はCDROM、setup後はHard Diskに変更。
Kernel:None
Initrd:None

User Interface
User Interface:SDL(Simple Direct media Layer)とVNC(Virtual Network Computing)の両方から選択。
VNC、SDLのどちらでもよいが自分の環境ではVNCを使用。
SDL(Simple Direct media Layer)とVNC(Virtual Network Computing)の両方から選択。
RFBプロトコルを使用しリモートデスクトップのように外部からアクセスしないのであればSDLを選択。
しかしSDLにすると上記のColor Modeの選択が出来なくなる為、自分の環境ではVNCに設定している。

Advanced
Disable HPETとDisable FD CheckとHigh Priorityにチェックを入れる。


外部との通信の為の設定
コマンドをぽちぽち打つだけなら当項目の設定は不要だが、ゲストOSにSSHでログインしたりFTPサーバを立ち上げて外部からの接続を許可したい場合は以下を設定する。

Network
Limbo PC Emulatorのデフォルト設定では、外部からのSSH接続やFTP接続は破棄する為、FTPのポートとSSHのポートを明示的に指定し穴をあける必要が有る。
Host Forwardの欄内に以下を入力。
ポート番号設定の左側の値(22222と22221)は外部から見えるポート番号(ホストOS側のポート番号)、右側の値(22と21)は内部の(ゲストOS側の)ポート番号。
外部側と内部側のポート番号を同一に設定する事は出来ない為、以下のように変える必要が有る。

hostfwd=tcp::22222-:22,hostfwd=tcp::22221-:21



Alpine Linuxのデプロイ開始
上記のLimbo PC Emulatorの設定を終えた後、Limbo PC Emulatorの再生ボタン(三角ボタン)にタッチし、Alpine Linuxを立ち上げる。
Alpine Linuxの起動完了後、rootアカウントでログインする。この段階ではパスワードの入力は求められない。
Limbo PC Emulatorで設定した仮想HDDにインストールする為、setup-alpineコマンドを実行する。

Welcome to Alpine Linux 3.11
Kernel 5.4.99-0-virt on an x86_64 (/dev/tty1)

localhost login: rootを入力しEnter

Welcome to Alpine!

The Alpine Wiki contents a large amount of how-to guides and general
information about administrating Alpine systems.
See <http://wiki.alpinelinux.org/>.

You can setup the system with the command: setup-alpine

You may change this image by editting /etc/motd.

localhost:~# setup-alpineを入力


setup-alpineコマンドを打った後の流れは、Googleで「Alpine Linux Virtualbox」などで検索すると複数ヒットする為、手順の詳細はここでは割愛。
以下はsetup-alpineに関する概要。

・Select keyboard layout では、Limbo PC Emulatorは日本語キーボード未対応につき usを選択。
・Available variants: は us を入力する。
・Enter system hostnameでは、ホスト名を入力。
・Which one do you want to initialize? は eth0しか無い為、eth0を入力。
・Ip address for eth0? では dhcpを入力。
・Do you want to do any manual network configuration? は noのまま。Limbo PC Emulator環境では、10.0.2.15/24で設定される。
・Changing password for root New password: では、rootアカウントの為のパスワードを設定。
・Which timezone are in? のTimezone設定では、デフォルトのUTCを選択。ここでJapanを選択しても、何故かシステムに反映されない。
・HTTP/FTP proxy URL? は noneのまま。
・Which NTP client to run? では chronyを選択。RHEL8(Red Hat Enterprise Linux 8)以降ではデフォルトのNTPクライアントはntpではなくchronyである為、ここでchronyを選択し覚えるのもよいかも。
・リポジトリの選択「Enter mirror number (1-17) or URL to add」では f を入力し、ミラーサイトを自動で選択。
・Which SSH server? では opensshを使用。
・Which disk(s) would you like to use? では sda を入力。
・How would you like to use it? では sysを選択。
・WARNING: Erase the above disk(s) and continue? では y を入力し、インストールを開始。ここで言う「Erase the above disk(s)」とはLimbo PC Emulator内の仮想的なディスクを指し、ホスト側(スマホ側)の内部ストレージの事ではない。

setup-alpineが完了したら、poweroffコマンドを入力しAlpine Linuxを一旦落とす。
Limbo PC Emulator設定の「Removable Storage」にてCDROMのチェックを外し、
「Boot Settings」にてBoot from Device:を Hard Diskに変更。
その後、Limbo PC Emulatorの三角ボタンにタッチし、Alpine Linuxを立ち上げる。

...そして、Alpine Linux on Android Smartphone !!



Limbo PC Emulator内のAlpine LinuxにSSHログインしたい
無線LAN環境において、Limbo PC Emulator内で動作するAlpine LinuxにSSHログインする事が出来る。
Tera TermやPuTTYやTerminus等のツールからSSHログインする事で、Limbo PC Emulator上の小さくて読みづらい文字から解放される。
(Alpine Linuxのコンソールのフォントサイズ変更は可能。下記の「Limbo PC Emulator上で表示されるフォントサイズを大きくする」を参照。)
Alpine LinuxはデフォルトでrootアカウントではSSHログインが出来ない為、別途ユーザアカウントを作成する必要が有る。
Alpine Linuxにrootでログインし、adduserコマンド(useraddではない!)でユーザを作成。

# adduser hoge ここでは追加したいユーザ名 hogeを入力
Changing password for hoge
New password:   アカウントhogeのパスワードを設定
Retype password:
passwd: password for hoge changed by root
#

これで上記で作成したアカウントで、Alpine LinuxにSSHログインが可能になる。

①PCやMacBook等からSSHログインする場合。
SSHログインの際に必要なIPアドレスは、Limbo PC EmulatorによりAlpine LinuxにアサインされたIPアドレスではなく、スマホ側にアサインされたIPアドレスである。

②Limbo PC Emulatorを動作させているのスマホからSSHログインする場合。
Terminus等SSHクライアントアプリを使用し、スマホ自分自身にSSHログインする形になる。
・SSHクライアントアプリに設定するIPアドレスはlocalhost(IPアドレス設定欄にlocalhostと入力)。
・ポート番号はLimbo PC EmulatorのHost Forwardの欄内にて設定したポート番号(上記では22222)を入力。


Limbo PC Emulator上で表示されるフォントサイズを大きくしたい
Alpine Linuxのコンソール画面のフォントが小さく文字が読み辛い場合は、以下の手順でConsole Fontを変更する。
① apk add terminus-fontを実行し、サイズが大きいフォントを含むフォントのパッケージをインストール。自分の場合、Terminusフォントをインストールした。
② /etc/conf.d/consolefontファイルを開き、consolefont="ter-128n.psf.gz"を追加し元の設定をコメントアウトする。
③ /etc/conf.d/consolefontファイルを保存し、rc-update add consolefont bootを実行。
④ Alpine Linuxを一旦落とし、Limbo PC EmulatorのGraphics設定を確認。
vmwareが選択されている場合はstdかcirrusに変更する。
⑤ Alpine Linuxを立ち上げる。

起動直後からフォントが変わるのではなく、起動中にフォントサイズが一旦小さくなり、起動完了直前の以下のログが出力された後に上記で設定したフォントに変わる。

setting console font [ter-128n.psf.gz] ... 

当設定の④はLimbo PC Emulatorで動作させている場合のみ実施。
VirtualBoxで動作させている場合は④の設定は不要。
フォントが細くて読みづらい場合は、consolefont="ter-128n.psf.gz"をconsolefont="ter-128b.psf.gz"に修正し、Alpine Linuxを再起動させる。


ashではなくbashのコマンドを打ちたい
Alpine Linuxでデフォルトで動作するシェルはash(Almquist Shell)という組み込み系Linuxで多く採用されているもの。
ログインシェルをbashに変更したい場合、bashのインストールと/etc/passwdファイルの編集、.bashrcと.profileの作成が必要となる。

~$ su
Password:
#
# echo $SHELL  
/bin/ash  デフォルトで動作しているshellはashである
#
# apk add bash bash-completion  apk addコマンドでbashとbash-completionをインストール
(1/6) Installing readline (8.0.1-r0)
(2/6) Installing bash (5.0.11-r1)
Executing bash-5.0.11-r1.post-install
(3/6) Installing pkgconf (1.6.3-r0)
(4/6) Installing bash-completion (2.9-r0)
(5/6) Installing openrc-bash-completion (0.42.1-r2)
(6/6) Installing kmod-bash-completion (26-r0)
Executing busybox-1.31.1-r9.trigger
OK: 95 MiB in 57 packages
# 
# sed -e 's;/bin/ash$;/bin/bash;g' -i /etc/passwd  sedで/etc/passwdファイルを編集
#
# exit
$
$ vi .bashrc .bashrcと.profileファイルを作成
$
$ vi .profile
$
$ exit

再ログイン

$
$ echo $SHELL 再ログイン後、bashになっている事を確認
/bin/bash
$
$



足りないコマンドをインストールしたい
PC上でもスマホ上でも良いので、下記リンク先のAlpine Linux packages(https://pkgs.alpinelinux.org/contents)にアクセスしコマンドを含んでいるパッケージを検索する。

①例えば、x86版のApline Linux 3.11.8にてtcpdumpコマンドを打ちたいけどtcpdumpコマンドが無い場合。
・一番左の欄(File)にコマンドを入力。
・Path欄は何も入力しないでOK
・Package欄も何も入力しないでOK
・edgeの欄はV3.11を選択。
・mainの欄はmain、community、testingから適宜選択。
・x86_64の欄は適宜選択し、Searchをクリックすると、コマンドを含有しているパッケージがPackage欄に表示される。
Alpine Linuxに戻り、apk add tcpdumpを実行すると、tcpdumpコマンドを含むパッケージがインストールされる。

②上記にてRepositoryがmainではなくcommunityで見つかった場合。例えばdockerパッケージの場合。
Alpine Linuxに戻り、/etc/apk/repositoriesファイルを開き、communityレポジトリのコメントアウトを外す。

#vi /etc/apk/repositories

#/media/cdrom/apks
http://dl-cdn.alpinelinux.org/alpine/v3.11/main
#http://dl-cdn.alpinelinux.org/alpine/v3.11/community   コメントアウトを外す
#http://dl-cdn.alpinelinux.org/alpine/edge/main
#http://dl-cdn.alpinelinux.org/alpine/edge/community
#http://dl-cdn.alpinelinux.org/alpine/edge/testing

その後、apk updateコマンドを打ちパッケージ情報を更新し、apk add dockerコマンドを実行する。
初めてapk updateを実行した際、完了まで時間を要する事が有る。

③パッケージ名がコマンドと一致しない場合。例えばvmstatはprocpsパッケージをインストールする事で実行可能になる。
そのような場合はGoogleにて"alpine linux vmstat"と検索するとAlpine Linux packages(https://pkgs.alpinelinux.org/)というサイトがヒットし、そこにアクセスするとパッケージ名が判明する。
Alpine Linux packagesで検索するよりGoogleで検索してアクセスする方が早く結果が得られる。

④Alpine Linux packagesでも見つからない場合。例えばdstatコマンドの場合。
UbuntuやCentOS等他のLinuxディストリビューションと同様に、tar玉からインストールする事が可能。

Apline Linux上にて wget http://dag.wieers.com/home-made/dstat/dstat-0.7.2.tar.bz2を打ちdstatのtar玉をダウンロード。
ダウンロード先にて tar jxf dstat-0.7.2.tar.bz2を実行し解凍。
dstatの実体はpythonスクリプトである為、./dstat --top-io -aなどdstatファイルをそのまま叩くと実行可能。


Alpine Linuxをアップデートしたい
メンテナンスナンバーのアップデート
例として、3.11.4から3.11.5へのアップデート方法を挙げる。
パッケージのアップデートの際にいつの間にかアップデートされる。
Alpine Linuxの公式サイトのALPINE NEWSにてアップデートが広報された後、インストール済みのパッケージのアップデートで実行するコマンドを叩くと、メンテナンスナンバーがアップデートされる。
※以下の例ではapk updateとapk upgradeコマンドの出力内容を省略している。

①アップデート前のバージョンを確認。

# cat /etc/os-release
NAME="Apline Linux"
ID=alpine
VERSION_ID=3.11.2
PRETTY_NAME="Alpine Linux v3.11"
HOME_URL="https://aplinelinux.org"
BUG_REPORT_URL="https://bugs.alpinelinux.org"
#


②アップデート実施。パッケージのアップデートと同じ。

# apk update
# apk upgrade


③アップデート完了後、再度/etc/os-releaseファイルの内容を出力させバージョンが3.11.2から3.11.3に上がった事を確認。

# cat /etc/os-release
NAME="Apline Linux"
ID=alpine
VERSION_ID=3.11.3
PRETTY_NAME="Alpine Linux v3.11"
HOME_URL="https://aplinelinux.org"
BUG_REPORT_URL="https://bugs.alpinelinux.org"
#


マイナーバージョンのアップデート
2021/11/13追記。例として、3.11.xから3.12.xへのアップデート方法を挙げる。
メンテナンスナンバーのアップデートとは異なり、/etc/apk/repositoriesファイルの編集が必要となる。

①vi等のエディタで/etc/apk/repositoriesファイルを開き、v3.11をv3.12に修正し保存。

# vi /etc/apk/repositories
以下の内容を...
#/media/cdrom/apks
http://dl-cdn.alpinelinux.org/alpine/v3.11/main
http://dl-cdn.alpinelinux.org/alpine/v3.11/community
#http://dl-cdn.alpinelinux.org/alpine/edge/main
#http://dl-cdn.alpinelinux.org/alpine/edge/community
http://dl-cdn.alpinelinux.org/alpine/edge/testing
 
以下のように修正
#/media/cdrom/apks
http://dl-cdn.alpinelinux.org/alpine/v3.12/main
http://dl-cdn.alpinelinux.org/alpine/v3.12/community
#http://dl-cdn.alpinelinux.org/alpine/edge/main
#http://dl-cdn.alpinelinux.org/alpine/edge/community
http://dl-cdn.alpinelinux.org/alpine/edge/testing


②apk updateコマンドを実行し、利用可能なパッケージのインデックスを更新する。
パッケージのアップデートと同じである。

# apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/community/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/edge/testing/x86_64/APKINDEX.tar.gz
v3.12.9-2-g99a235d4ef [http://dl-cdn.alpinelinux.org/alpine/v3.12/main]
v3.12.8-36-g62d106802b [http://dl-cdn.alpinelinux.org/alpine/v3.12/community]
v3.15.0_rc1-56-g70b180a18a [http://dl-cdn.alpinelinux.org/alpine/edge/testing]
OK: 17425 distinct packages available
#


③パッケージのアップデート。
availableオプションによりパッケージのバージョンが同じであっても強制的にアップデートする。

# apk upgrade --available
(1/53) Upgrading musl (1.1.24-r3 -> 1.1.24-r10)
(2/53) Replacing acct (6.6.4-r0 -> 6.6.4-r0)
(3/53) Upgrading busybox (1.31.1-r11 -> 1.31.1-r21)
Executing busybox-1.31.1-r21.post-upgrade
:
省略
:
Executing syslinux-6.04_pre1-r6.post-upgrade
Executing busybox-1.31.1-r21.trigger
Executing kmod-27-r0.trigger
Executing mkinitfs-3.4.5-r3.trigger
==> initramfs: creating /boot/initramfs-virt
Executing syslinux-6.04_pre1-r6.trigger
/boot is device /dev/sda1
OK: 93 MiB in 52 packages
#


④アップデート完了後、念の為syncコマンドを打った後、rebootコマンドでAlpine Linuxを再起動。

# sync
# sync
# sync
# reboot
 :
再起動完了後、ログイン画面にてAlpine Linuxのバージョンが3.11から3.12に上がっている事が分かる。
 
Welcome to Alpine Linux 3.12
Kernel 5.4.143-0-virt on an x86_64 (/dev/tty1)
 
localhost login:


⑤ログイン後、再度/etc/os-releaseファイルの内容を出力させバージョンが3.11.3から3.12.9に上がった事を確認。
Alpine Linuxのアップデートはこれで完了。

# cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.12.9
PRETTY_NAME="Alpine Linux v3.12"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/"
#



その他
・他のAndroidスマホでもAlpine Linuxのデプロイは可能。現段階(2021年3月)にてミドルレンジ以上のスペックのスマホなら、デプロイ後はそこそこ快適に動作するだろう。
・Limbo PC EmulatorのiOS版は存在しない。どうしてもiPhoneやiPadでAlpine Linuxを動作させたい場合は類似するアプリを探す必要が有る。
・CentOSやUbuntuなどメジャーなディストリビューションは軽量な過去バーションであってもデプロイが完了しない為、諦めてAlpine Linuxを入れた。
例えばCentOS 5.11のNetwork Installであっても、ブート時のドライバの読み込みの段階で止まる。半日程放っておけばログインプロンプト出力の所まで進んでいるかも知れないが、気が短い為にさっさとLimbo PC Emulatorから削除。Alpine Linuxを選択した。
・この後、Limbo PC Emulatorの中で動作するAlpine LinuxにてFTPサーバを構築しました。構築手順に関しては以下のリンク先をご参照ください。
・当記事の内容を実行した事による故障や損害について、当ブログの著者は一切の責任を負いかねますのであらかじめご了承ください。

Sony Xperia 1で動作するAlpine Linux。(2022/3/28追記)


リンク集
https://alpinelinux.org/ Alpine Linux
https://pkgs.alpinelinux.org/contents? Alpine Linux packages
https://sourceforge.net/projects/limbopcemulator/ Limbo PC Emulator
https://play.google.com/store/apps/details?id=org.pocketworkstation.pckeyboard&hl=ja Hacker's Keyboard
https://www.sonymobile.co.jp/xperia/softbank/xz2/spec.html SONY Xperia XZ2
https://www.linux-kvm.org/images/a/a9/Kvm-forum-2013-Windows8-on-Android-with-KVM.pdf Running Windows 8 on top of Android with KVM


Alpine Linuxに関する記事
https://debslink.hatenadiary.jp/entry/20200506/1588733149 Androidスマホで動作するAlpine LinuxにてFTPサーバを構築 (2020/5/7追加)
https://debslink.hatenadiary.jp/entry/20211024/1635075047 Alpine Linuxの保守用コマンド (2021/10/24追加)
https://debslink.hatenadiary.jp/entry/20211228/1640668431 Alpine Linuxでawallを使ってiptables設定 (2021/12/28追加)
https://debslink.hatenadiary.jp/entry/20220101/1640973274 Alpine LinuxのFTPで暗号化通信 FTPS編 (2022/1/1追加)
https://debslink.hatenadiary.jp/entry/20220111/1641903376 Alpine LinuxのFTPで暗号化通信 SFTP編 (2022/1/11追加)