2022-06-03

在 Android 上安裝及執行真正的 Linux

受自己的文章 在 Android 裝置上建立 NextCloud伺服器 啟發,希望可以在 Android 做到更多操作
因此繼續了解 Termux 運行 Linux 的可行性
雖然 Android 的核心修改自 Linux ,但實際不是 Linux 的核心
因此經 PRoot 運作的 Linux 檔案系統,仍然無法執行涉及 Linux 核心的功能
要完全讓真正的 Linux 能在 Android 中運作,必須提要建立虛擬環境
讓 Linux 能夠在虛擬環境中運作,來迴避 Linux 核心問題

更新 Termux

見下文
開啟 Termux ,輸入
pkg update

更新套件

見下文
輪入 y 確定升級套件

見下文
部分套件升級後會建議更新件來源,可以輸入 y 確定

安裝 QEmu 及下載 QCOW2映像檔

見下文
輸入
pkg install wget openssh qemu-system-x86-64-headless

安裝 wget, openssh, 支援模擬 amd64 架構的 QEmu

見下文
見下文
輪入 y 確定安裝套件

見下文
輸入
wget "https://cdimage.debian.org/cdimage/cloud/sid/daily/latest/debian-sid-nocloud-amd64-daily.qcow2"

下載 最新版本 AMD64 架構的 Debian SID 的 QCOW2映像檔

起動 QCOW2映像檔

見下文
輸入
qemu-system-x86_64 -hda "debian-sid-nocloud-amd64-daily.qcow2" -m 2G

  • -hda 載入 raw 或 qcow2 的映像檔
  • -m 為設定記憶體數量,沒有單位時為 M ,支援 G, T, P 後綴
由於 Termux 的 QEmu 使用 headless 套件,因此必須使用外部方式連接
預設使用 VNC 連接,正常情況下會使用 127.0.0.1:5900

使用 VNC 連接
雖然能夠使用網絡連接,但 QEmu 預設 使用 網路位址轉換 (Network Address Translation (NAT)) 作為網絡連接方式
所以虛擬系統的 IP 只有 宿主系統 (Host System) 能夠存取,因此必須使用 宿主系統 連接到 QEmu 的 VNC伺服器
見下文
在下使用 RealVNC ,但並沒有指明使用哪種 VNC用戶端
最重要能夠 使用鍵盤傳送文字訪客系統 (Guest System)

見下文
見下文
在 New Connection
在 Address 輸入 127.0.0.1:5900
Name 可以不輸入資料 (但可以方便管理連接的伺服器)

見下文
見下文
在設定頁面
在下建議將 Picture Quality 更改為 Low 降低連接的資源要求
Update desktop preview 更改為 No

載入到 宿主系統
見下文
見下文
連接到 VNC伺服器
與正式安裝的起動畫面相同
(可能機能限制,在下的 Android裝置 起動時間大約7分鐘)

見下文
由 Debian 官方下載的 NoCloud QCOW2 映像檔其 root 帳戶沒有設置密碼
一些功能必須帳戶有設置密碼才能運作,先設定密碼,輸入
passwd

輸入兩次新密碼

起動 SSH服務
見下文
由於使用 VNC 傳送文字比較轉接
在下建議啟動 SSH服務 方便往後的操作,輸入
service sshd restart

但 SSH服務 無法啟動,在下輸入
service sshd status

出現 (code=exited, status=1/FAILURE)
及輸入
sshd -t

出現 no hostkeys available -- exiting.
的錯誤

修改 SSH 錯誤
見下文
由於 SSH服務 找不到公鑰及私鑰,因此無法啟動
ssh-keygen -A

替 SSH服務 建立公鑰及私鑰,輸入
service sshd restart

沒有出錯,輸入
service sshd status

顯示 SSH服務 正在運作

輸入
ip a

由於 QEmu 使用 NAT ,顯示 IP地址 為 10.0.2.15
亦即是 訪客系統 是無法直接與 宿主系統 外的裝置共享網絡資源
輸入
poweroff

關閉 訪客系統

連接埠轉發
見下文
要 訪客系統 讓 宿主系統 外的裝置共享網絡資源
需要設定 連接埠轉發 (Port Forward) ,將連接到 宿主系統 的網絡訊號轉發到 訪客系統
輸入
qemu-system-x86_64 -hda "debian-sid-nocloud-amd64-daily.qcow2" -m 2G -netdev user,id=nic0,hostfwd=tcp::64022-:22 -device virtio-net-pci,netdev=nic0 &

  • -netdev 設定 網絡裝置參數
    • user 設定為 訪客系統 使用 NAT 連接到網絡
    • id=nic0 設定 網絡裝置的 ID ,不一定使用 nic0 ,只是方便分辨用途
    • hostfwd 參數為
      • [tcp|udp] 選填,選擇 tcp 或 udp 其中一項,不填寫為 tcp 及 udp 同時選擇
      • [host-ip] 選填,宿主系統 IP地址,宿主系統 預設 IP地址
      • <host-port> 必填,宿主系統 的 連接埠
      • [guest-ip] 選填,訪客系統 IP地址,訪客系統 預設 IP地址
      • <guest-port> 必填,訪客系統 的 連接埠
  • -device 設定 裝置參數
    • virtio-net-pci 設定 虛擬網絡卡
    • netdev=nic0 指定 網絡裝置 ,與 -netdev 的 id 相同
訪客系統 安裝 虛擬網絡卡
當 宿主系統 接收到 TCP協定 來自 64022連接埠 的網絡資料,會轉發到 訪客系統 的 22連接埠

最後的 & 符號,讓指令在背景執行

輸入
ssh root@127.0.0.1 -p 64022

顯示嘗試連接 SSH伺服器 但出現 Permission denied (publickey). 錯誤

修改 SSH 設定檔
見下文
重次使用 VNC 登入 伺服器,輸入
nano "/etc/ssh/sshd_config"

編輯 /etc/ssh/sshd_config
(Debian 預裝 nano 編輯器)

見下文
見下文
見下文
修改設計
  • PermitRootLogin 修改為 yes
  • PublicAuthentication 修改為 yes
  • PasswordAuthentication 修改為 yes
井號 (#) 為前綴時,表示沒有功能的文字內容

使用 SSH 登入
見下文
回 Termux 輸入
ssh root@127.0.0.1 -p 64022

終於可以經 SSH 登入 訪客系統

見下文
能夠使用 SSH 登入後,操作便可以更方便
除了 Android裝置 不需要經常切換 Termux 及 VNC ,還可以讓其他裝置連接

多重連接埠轉發

見下文
安裝 Apache網頁伺服器

見下文
安裝完成後,關閉 訪客系統

見下文
回到 宿主系統
要增加 連接埠轉發 ,只需要在 -netdev 增加 hostfwd 項目即可
例如在下需要將 宿主系統 64022連接埠 轉發到 訪客系統 22連接埠 及 宿主系統 64080連接埠 轉發到 訪客系統 80連接埠,參數為
,hostfwd=tcp::64022-:22,hostfwd=tcp::64080-:80

見下文
再次起動 訪客系統 及啟動 Apache伺服器

見下文
可以經網頁瀏覽器觀存取

增加 QCOW2 容量

見下文
在 訪客系統 輸入
df -H

會發現掛在 根目錄 (/)/dev/sda1 分區 的 只有 2 GB
雖然只是測試用途,但 2 GB 仍然太少,要增加容量才有更多空間測試

見下文
關閉 訪客系統
有時即使關閉 訪客系統 ,程式仍然在背景執行,輸入
ps aux | grep "qemu"

確認 QEmu 是否仍在執行,如果未能關閉,輸入
kill <QEmu ID>

關閉程式

見下文
輸入
pkg install qemu-utils

安裝 QEmu 支援程式

見下文
輸入
qemu-img info "debian-sid-nocloud-amd64-daily.qcow2"

同樣的 virtual size 同樣顯示只有 2 GiB

見下文
輸入
qemu-img resize "debian-sid-nocloud-amd64-daily.qcow2" 32G

顯示 Image resized.
再輸入
qemu-img info "debian-sid-nocloud-amd64-daily.qcow2"

virtual size 顯示 32 GiB.

見下文
載入到訪客系統,輸入
dh -H

顯示 /dev/sda1 為 34GB

補充資料

最初在下使用
qemu-img create -f qcow2 "my-debian.qcow2" 32G

  • qemu-img create 是建立 虛擬硬碟 指令
  • -f qcow2 建立 QCOW2 虛擬碟碟,亦可以使用 -f raw 建立 RAW 虛擬碟碟
    • QCOW2 佔用空間較少,速度較慢
    • RAW 佔用空間較多,速度較快
  • "my-debian.qcow2" 是 虛擬硬碟 的檔案名
  • 32G 是 虛擬硬碟 的容量
自行建立 QCOW2 虛擬硬碟,再使用
qemu-system-x86_64 -hda "my-debian.qcow2" -m 4G -cdrom "debian-amd64.iso" -boot d

  • -cdrom 載入光碟檔案
  • -boot 變更起動方法
    • c 為 硬碟
    • d 為 光碟
    • n 為 網絡
建立 QCOW2 Debian 訪客系統,在下已經 沒有安裝 桌面環境伺服器標準系統設備
但安裝時間接近 3小時 才完成,而且安裝後的體積大約 1.6 GB ,非常沒有效率
其後發現 Debian 提供很多不同種類 QCOW2映像檔 而且體積大約只有 300 MB 至 500 MB
不足 1 GB 體積卻有齊全的基本功能,而且最新版發佈版本預載 最新核心 及 SSH伺服器

總結

由於在下想測試最新的 Debian ,因此使用 SID 開發分支
而且 SID 分支不需要區分 Debian 版本,下載的連結固定,所以下載 Debian SID Generic 版本
但 Generic 版本需要使用 virt-customize 重設 root 帳戶的密碼才能使用
由於 Termux 卻無法安裝屬於核心功能的 libguestfs-tools ,因此每次下載都要使用電腦重設 root 帳戶
而且不知為何沒有網絡功能,非常麻煩

在下改用 Debian 11 Generic (當前穩定版) 及 Debian 12 Generic (當前測試版)
所有基本功能正常無誤,但仍然需要使用 virt-customize 重設 root 帳戶,仍然不方便
仔細閱讀 Debian 下載各種 QCOW2映像檔 的首頁,才發現除了還細分
  • Azure 針對 Microsoft Azure 的改造版本
  • EC2 針對 Amazon EC2 的改造版本
  • Generic 適合 Cloud-Init 的改造版本,例如:OpenStack, DigitalOcean
  • GenericCloud 適合任何虛擬環境的版本
  • NoCloud 適合測試用途的版本,沒有預裝 Cloud-Init ,而且允許 root 在沒有密碼下登入
因此在下改用 NoCloud 版本,而且最重要是不需要特殊設定便可以在 Termux 中運作正常

另外在下使用 qemu-system-i386 能夠將 Windows XP 安裝及在 Termux 中起動
還安裝一些遊戲在 Windows XP 運作,都能正常執行,但不要期望運作速度會與電腦效能相同
使用觸控操作傳統桌面環境並不方便,需要外接鍵盤及滑鼠才能有類似電腦的操作體驗

參考資料

沒有留言 :

張貼留言