2018-09-13

在 Android 裝置上運行 Linux 及各種軟件及伺服器

Android 有不少 Terminal Simulator 應用程式可以讓 Android 模擬 Linux 執行部分 Linux 指令
有些 Android 開發者製作了,例如 Linux Deploy 可以安裝不同 Linux發行版
但 Android裝置 的需要具有 root 權限才能使用,正常運作

由於一般 Android 內建的 虛擬鍵盤 輸入工具,並沒有像一般鍵盤的操作按鈕,如 CtrlAltEsc 之類控制按鈕
在安裝 UserLAnd 前先安裝 具備控制按鈕 的鍵盤方便輸入

#################### Hacker's Keyboard ####################

見下文
Play Store 搜尋及安裝 Hacker's Keyboard 這個具備控制按鈕的虛擬鍵盤

見下文
開啟 Hacker's Keyboard

見下文
按下 Enable keyboard 並啟用 Hacker's Keyboard

見下文
Android 會發出警告,指這類 第三方輸入工具,有機會在閣下輸入時盜取資料

見下文
按下 Set Input Method 並選擇 Hacker's Keyboard

見下文
見下文
見下文
留意
Hacker's Keyboard 在畫面 直向 時鍵盤的功能並不完全
需要在畫面 橫向 時才有完全功能

若閣下有可連接 Android 裝置的鍵盤亦可使用 實體鍵盤
在下是使用 藍芽鍵盤 與 Android 裝置配對

見下文
掃瞄 藍芽裝置

見下文
Android 裝置與 藍芽鍵盤 配對

見下文
Android 裝置與 藍芽鍵盤 連接

#################### UserLAnd ####################

見下文
正式搜尋及安裝 UserLAnd

見下文
啟動 UserLAnd 的畫面

見下文
Session 的分頁
Session Name 輸入 Session 名稱,及在 Filesystem 選擇 檔案系統
若第一次使用需要 建立檔案系統,按 Create New 或到 Filesystems 分頁

見下文
Filesystem Name 輸入 檔案系統名稱
UserLAnd 暫時只提供 DebianFilesystem 類型
完成後按右上的 儲存按鈕

見下文
Client TypeService Type 選擇
ssh 自動選擇 ConnectBot
vnc 自動選擇 bVNC
Username 自動選擇 user
Session 的設定正確亦可以按右上的 儲存按鈕

見下文
顯示已建立的 Session

見下文
按下已建立的 Session

見下文
同意 UserLAnd 的使用權限

見下文
第一次運行需要下載 Filesystem 及設定資料,需要一段時間
預設使用者帳戶 user 密碼 userland

見下文
Session 正式運作後會顯示 綠色圖示

見下文
按著已運作的 Session 可以按 Kill Service 停止 Session 運作

見下文
按著已停止運作的 Session 可以按 Delete 刪除 Session

見下文
見下文
Filesystem 亦可以以同樣方式刪除

由於 UserLAnd 已經預載 Dropbear SSH伺服器
其實可以在電腦連接 Dropbear 可能更方便
但若果閣下沒有電腦,便需要使用在 Android 上運行的 SSH工具

#################### ConnectBot ####################

見下文
若 Android 未安裝 ConnectBot 會自動開啟 Play StoreConnectBot 的頁面
安裝 ConnectBot

見下文
開啟 ConnectBot

見下文
更多選項 ,點選 Settings

見下文
由於在下希望畫面能以 橫向 顯示,點選 Ratotion mode

見下文
點選 Force Landscape
若閣下 Android 裝置的畫面不大,可以啟用 Autohide title barFull screen 用盡整個畫面

見下文
按下 右下角 的新增按鈕
設定連接的 SSH伺服器 ,資訊為 user@127.0.0.1:2022

見下文
建立 SSH 連接

同樣 UserLAnd 已經預載 VNC伺服器
其實可以在電腦連接 VNC 可能更方便
但若果閣下沒有電腦,便需要使用在 Android 上運行的 VNC工具

#################### bVNC ####################

見下文
Android 未安裝 bVNC 會自動開啟 Play Store 到 bVNC 的頁面
安裝 bVNC

見下文
開啟 bVNC
有使用說明,按 Close 關閉使用說明

見下文
VNC Server127.0.0.1
Port5951
VNC Usernameuser
VNC Passworduserland
其餘使用預設值即可
設定後按 Connect 連接 UserLAndVNC伺服器

見下文
UserLAnd 使用 xterm 作為預載 VNC伺服器
雖然能使用遊標操作,但並不容易使用,功能又很少,主要仍然是以指令操作為主

見下文
若需要離開 xterm 按一下畫面,會出現 更多選項 並點選 Disconnect 便會離開

#################### 連接 Dropbear SSH 伺服器 ####################

見下文
YES 確認連接 SSH伺服器

見下文
輸入 userland 登入 (大小寫相符)

見下文
登入至 UserLAnd

#################### 登入後基本設定 ####################

見下文
輸入
su 
root 身份登入
由於剛才是以 user 登入,被免在 user的家目錄 中建立檔案不屬於 user 的檔案,因此輸入
cd 
root 回到 root的家目錄

見下文
輸入
passwd
設定 root密碼
方便讓 SSH工具 直接以 root 登入

見下文
若果需要登出,可以輸入
exit
然後按 YES 即可
(由於先登入 user 再登入 root ,因此示範需要登出兩次)

見下文
或到 右上角更多選項
點選 Disconnect ,亦可以登出

見下文
輸入
echo 'DPKG::Progress-Fancy 1;' >'/etc/apt/apt.conf.d/99progressfancy'
與先前的文章相同,讓使用 apt-get 時顯示進度表
只是方便了解進度,不一定需要設定
注意:確保正在使用 root

見下文
輸入
file='/etc/apt/sources.list'
mv "${file}" "${file}.bak"
cat "${file}.bak" | sed -r 's/stable/buster/g' >"${file}"
apt-get update
由於在下使用 UserLAnd 時, Debian 已經發佈了 buster (Debian 10) 的來源
因此修改 /etc/apt/sources.list 使用最新的 Debian 來源
並更新軟件資料
(例如將來源的 stable 改成 buster ,最新未必是使用 buster注意大小寫)

見下文
輸入
apt-get upgrade
升級軟件

見下文
輸入
apt-get dist-upgrade
升級發行版軟件

見下文
輸入
apt-get install apt-utils bash-completion bzip2 curl dialog file iputils-ping net-tools p7zip* nano vim wget
安裝一些在下認為實用的軟件
若閣下認為沒有必要可以略省,或有需要亦可以安裝更多適合閣下使用的軟件

見下文
輸入
dpkg-reconfigure tzdata
設定時間資料

見下文
見下文
見下文
設定時區及地方
例如在下身處 亞洲 香港

若想自動設定,輸入
timezone='Asia/Hong_Kong'
echo "${timezone}" >'/etc/timezone'
file='/etc/localtime'
rm "${file}"
ln -s "/usr/share/zoneinfo/${timezone}" "${file}"

見下文
輸入
apt-get install fonts-arphic* locales w3m
安裝中文字型語言w3m網頁瀏覽器
同樣,有需要可以添加更多中文字型

見下文
輸入
dpkg-reconfigure locales
設定語言資料

見下文
見下文
建議點選 en_HK.UTF-8en_US.UTF-8zh_HK.UTF-8zh_TW.UTF-8 設定語言資料

見下文
見下文
設定系統語言,建議使用 en_US.UTF-8

同樣可以使用自動設定,輸入
file='/etc/locale.gen'
encoding='UTF-8'
for language in 'zh_TW' 'zh_HK' 'en_HK' 'en_US'; do
    echo "${language}.${encoding} ${encoding}" >>'/etc/locale.gen'
done
echo LANG="${language}.${encoding}" >'/etc/default/locale'
locale-gen

見下文
設定語言後輸入
locale
可顯示選用的語言
雖然安裝完成,但仍然未選用任何語言,語言資料使用 POSIX

見下文
輸入
w3m www.google.com.hk
w3m網頁瀏覽器 測試中文能否顯示

見下文
中文未能正確顯示,未能顯示的中文字型以 ? (問號) 顯示
按下 q 再按 y 離開 w3m網頁瀏覽器

見下文
輸入
LANG=en_US.UTF-8 w3m www.google.com.hk
臨時以 en_US.UTF-8 的編碼執行 w3m網頁瀏覽器 測試中文能否顯示

見下文
終於能正常顯示中文字型

見下文
輸入
export LANG=en_US.UTF-8
將此 Session 的語言設定為 en_US.UTF-8

見下文
若想每次登入 UserLAnd Debian 時都自動以 en_US.UTF-8 為預設語言,輸入
echo "export LANG=en_US.UTF-8" >"${HOME}/.bashrc"
重新執行 UserLAnd Debian 才能生效
(留意:需要不同帳戶登入都自動設定,需要在每個帳戶的 ${HOME}/.bashrc 都加上 export LANG=en_US.UTF-8

見下文
輸入
locale
發現自動設定為 en_US.UTF-8

#################### Samba ####################

見下文
輸入
apt-get install samba smbclient
安裝 Sambasmbclient

見下文
輸入
smbpasswd -a root
設定 rootSamba 密碼
密碼可與 SSH伺服器登入密碼不同
有需要亦可以設定其他帳戶的密碼

見下文
輸入
nano /etc/samba/smb.conf
編輯 Samba設定檔
(不一定使用 nano ,任何 文件編輯器 亦可)

見下文
[homes] 的設定範圍的 ; (分號) 刪除,以啟用 homes 的設定資料
read only 修改為 no ,讓登入帳戶能寫入資料
create mask 修改為 600 ,當上載檔案後之有使用者具只有 讀取寫入 權限
並按 Ctrl X 離開文件

見下文
由於文件曾經修改會詢問是否需要儲存,按 y 確認

見下文
詢問是否寫入至原檔案,按 ENTER 儲存並離開

見下文
輸入
service smbd restart
重新啟動 Samba

見下文
測試 Samba
輸入
smbclient //127.0.0.1/homes --user=user --port=2445
並輸入 Samba帳戶 的密碼登入
(UserLAnd 將所有 少於1024的預設連接埠 都需要加上 2000
例如 Samba 原本使用 445 ,在 UserLAnd 中使用 Samba 會強制改成使用 2445)

見下文
輸入
ifconfig
獲得 Android 的 IP

見下文
見下文
見下文
若沒有 ifconfig 亦可以到 Settings > About tablet > Status > IP address 找到 IP

見下文
見下文
見下文
測試使用 相同網路的電腦 登入 Samba

#################### ProFTPD ####################

見下文
輸入
apt-get install proftpd-basic ftp
安裝 ProFTPDftp

見下文
安裝後,輸入
service proftpd restart
重新啟動 ProFTPD

見下文
測試 ProFTPD
輸入
ftp 127.0.0.1 2021
發現 root 不能登入,但 user 卻能登入

見下文
輸入
nano /etc/ftpusers
編輯 /etc/ftpusers 設定檔

見下文
/etc/ftpusers禁止登入 設定檔中的帳戶
若需要 允許登入 root 便需要將 root 從設定檔 移除
(使用 # (井號)root 成為 備註 亦可)

見下文
輸入
nano /etc/proftpd/proftpd.conf
編輯 /etc/proftpd/proftpd.conf 設定檔

見下文
/etc/proftpd/proftpd.conf 中加入
<Global>
RootLogin on
</Global>
完成後儲存及離開,並重新啟動 ProFTPD

見下文
能夠以 root 登入 ProFTPD

見下文
見下文
見下文
測試使用 相同網路的電腦 登入 ProFTPD
若需要傳輸資料,在登入 ProFTPD 後,需要先執行 passive 切換為被動模式才能操作

FTP伺服器能讓外部網路存取,但需要 對外連接IP

見下文
再次修改 /etc/proftpd/proftpd.conf
MasqueradeAddress 改為 0.0.0.0
完成後儲存及離開

見下文
輸入
curl ifconfig.io
ifconfig.io 獲得 對外連接IP

見下文
重新啟動 ProFTPD
顯示以 對外連接IP

見下文
如果需要由外部網路連接,便需要在 Router 設定 DMZPort Forwarding ,讓指定電腦及連接埠能從外部連接
在下不打算將 DMZ 指向 Android 裝置,因此會使用 Port Forwarding
本來 FTP預設連接埠21 ,同樣因為 UserLAnd 關係,被強制使用 連接埠2021
因此設定 Port Forwarding 為 Android 的內部 IPTCP連接埠2020 至 2021

見下文
以外部網路測試,顯示登入成功

除了直接編輯 /etc/proftpd/proftpd.conf ,亦可以到 /etc/proftpd/conf.d 的目錄中增加需要的設定檔
例如設定 MasqueradeAddress 可以建立 /etc/proftpd/conf.d/MasqueradeAddress.conf 輸入設定值,同樣可以達到相同效果
由於 /etc/proftpd/proftpd.conf 於設定檔最後位置才導入 /etc/proftpd/conf.d 的設定檔
若有相同設定資料,會以 /etc/proftpd/conf.d 的設定檔為最後設定值

#################### CUPS ####################

見下文
輸入
apt-get install cups lpr

見下文
輸入
service cups stop
停止 CUPS
然後輸入
service cups start
啟動 CUPS
因為 CUPS 會發生啟動後無法回到指令操作,需要按 Ctrl Z 返回指令操作
因此不直接使用 restart 來重新啟動 CUPS

見下文
使用 網頁瀏覽器 瀏覽 http://127.0.0.1:2631CUPS設定介面

見下文
見下文
Edit Configuration File 修改 /etc/cups/cupsd.conf 設定檔
將 Listen 改為 631
及在 Order allow,denyOrder deny,allow 下一行加入 Allow from all 讓何任人都能夠存取 CUPS設定介面
但相對會比較危險,亦可以限制讓 特定IP 或使用 Deny from 允許或阻止存取
另外還要留意 Order 的次序, Order deny,allow 先阻止特定資料,再允許特定資料, Order allow,deny 先允許特定資料,再阻止特定資料
如果阻止與允許的資料沒有衝突,先後次序沒有分別,但有衝突時便需要考慮次序
例如
Order deny,allow
Allow from all
Deny from 10.6.8.*
因為 deny 比 allow 前, Deny from 10.6.8.* 會被 Allow from all 覆蓋,導致 Deny from 10.6.8.* 變得無意義
Order allow,deny
Allow from all
Deny from 10.6.8.*
因為 allow 比 deny 前,所以會先允許資料,再阻止 10.6.8.*
Allow from 及 Deny from 的次序不影響 Order 的次序

見下文
修改完成後,按 Save Changes
需要登入 擁有管理員權限 的帳戶才能更新設定,並會強制以 HTTPS 連接

見下文
CUPS 正在更新設定並自動重新啟動

見下文
Add Printer 選擇需要安裝的 印表機

見下文
設定 印表機名稱
其他如 DescriptionLocation 可以不設定
若不打算分享 印表機 亦可以不啟動 Sharing 功能

見下文
選擇合適安裝的 驅動程式
如果在建議清單中沒有需要安裝得驅動程式,便要到 https://www.openprinting.org/download/PPD/ 尋找

見下文
設定 印表機 預設操作資料
Set Default Options 來完成設定

見下文
完成設定

見下文
MaintenancePrint Test Page 測試 列印

見下文
將測試列印的頁面,經 CUPS 傳送資料到 印表機

見下文
CUPS網絡介面 顯示正在準備列印的資料

見下文
已列印的資料會隱藏
可以 Show Completed JobsShow All Jobs 顯示 已完成列印所有列印 資料

見下文
測試頁

見下文
見下文
列印文件測試
在下直接到網上尋找文件測試
w3m 'www.google.com.hk/search?q=the c programming language filetype:pdf'
若閣下已有需要測試的文件,便直接使用閣下的文件

見下文
輸入
lp -d 'printer-name' -o page-ranges=1 'file'
printer-name 是印表機名稱
-o page-ranges=1 是只列印文件的第1頁,若果只是進行測試,避免列印整份文件
file 是列印文件的檔案名稱,若果文件有空格,必須以 ' (單引號)" (雙引號) 包著檔案名稱
lp 還有其他列印選項,可以到 CUPS.org 的 Command-Line Printing and Options 網頁查看詳細操作方法

見下文
列印文件的效果

見下文
見下文
亦可以簡單地列印 標準輸出 測試
輸入
echo 'hello, world' | lp -d 'printer-name' -o page-ranges=1

#################### Transmission ####################

見下文
輸入
apt-get install transmission-daemon
安裝 Transmission Daemon

見下文
Transmission Daemon 能以系統服務運作,設定檔會建立在 /etc/transmission-daemon/settings.json
Transmission Daemon 除了能以系統服務運作,還可以因應不同帳戶運作
輸入
transmission-daemon
for pid in `pidof 'transmission-daemon'`; do kill "${pid}"; done
nano "${HOME}/.config/transmission-daemon/settings.json"
先執行一次 Transmission Daemon 讓系統自動建立預設的 Transmission Daemon 的設定資料
但預設資料並不一定適合使用,因此執行 killTransmission Daemon 停止
再編輯 ${HOME}/.config/transmission-daemon/settings.json Transmission Daemon 設定檔

見下文
Transmission Daemon 設定檔使用 JSON 格式
有很多設定資料,可以簡單為
{
    "download-dir": "~/Downloads",
    "rpc-enabled": true,
    "rpc-authentication-required": true,
    "rpc-username": "username",
    "rpc-password": "password",
    "rpc-url": "/transmission/",
    "rpc-port": 9091,
    "rpc-whitelist-enabled": false
}
download-dir 設定 下載資料位置 ,預設使用 家目錄的Downloads
rpc-enabled 設定啟動 Remote Procedure Call (RPC) ,預設啟動
rpc-authentication-required 設定啟動 RPC認證 ,預設啟動
rpc-username 設定 RPC帳戶名稱 ,不需要與登入帳戶相同
rpc-password 設定 RPC帳戶密碼 ,不需要與登入密碼相同,當密碼不是 { 字頭,當 Transmission Daemon 運作時,會自動加密
rpc-url 設定 RPC路徑 ,預設使用 /transmission/
rpc-port 設定 RPC連接埠 ,預設使用 9091
rpc-whitelist-enabled 設定啟動 RPC白名單 ,預設啟動

見下文
使用 網頁瀏覽器 瀏覽 http://127.0.0.1:9091/transmission/
輸入設定資料的 RPC帳戶名稱RPC帳戶密碼
然後按 SIGN IN

見下文
登入 Transmission Daemon

見下文
見下文
見下文
Transmission Daemon 除了能上載本機的 Torrent
還可以直接將 Torrent 的連結加入至 Transmission Daemon
Destination folder 預設為設定資料的位置
Start when addedTorrent 加入至 Transmission Daemon 會自動開始下載資料

見下文
下載資料位置 找到 Transmission Daemon 下載的資料

#################### Sendmail ####################

見下文
輸入
apt-get install sendmail telnet
安裝 SendmailTelnet

見下文
Debian 提供的 Sendmail 已經設置妥當,已經可以直接使用及測試
輸入
telnet localhost 2025
**********
EHLO localhost
**********
MAIL FROM: root@localhost
**********
RCPT TO: recipient@domain
**********
DATA
Subject: This is subject
This is body
.
**********
QUIT
當中的 ********** (星號串) 是由 Sendmail 產生的 回應碼資訊
telnet localhost 25Sendmail郵件伺服器 位置,使用本機連接
EHLO localhost 呼叫 Sendmail
MAIL FROM: root@localhost 設定送件者郵件位置,必須填寫
RCPT TO: recipient@domain 設定收件者郵件位置,最少填寫1個
DATA 開始編寫郵件內容
Subject: This is subjectThis is body 分別是 郵件主題郵件內容
當編寫完成後需要在最後編寫 .換行 結束
QUIT 完成發送郵件後,離開 Telnet

見下文
由於使用 個人郵件伺服器 通常都沒有認證 , 因此通常 郵件服務提供者 都會視這些郵件當作 垃圾郵件
甚至不會接收這類郵件
另外亦需要確定閣下的 網絡服務提供者 允許閣下能使用 SMTP 才能 對外發送郵件

#################### Git ####################

見下文
見下文
輸入
apt-get install git-core
安裝 Git
與在下的 自建簡單 Git 伺服器 操作完全相同

#################### PHP SQLite3 ####################

見下文
輸入
apt-get install php sqlite3 php-sqlite3
安裝 PHPSqlite3

見下文
輸入
echo -n '<?php phpinfo(); ?>' >'phpinfo.php'
製作一個簡單的 PHP 測試頁
輸入
php -S 127.0.0.1:8080
可以執行 臨時網頁伺服器 ,按 Ctrl C 可以停止 臨時網頁伺服器 運作

見下文
由於使用 127.0.0.1 只能讓本機查看
以 Android 裝置的 網頁瀏覽器http://127.0.0.1:8080 查看

見下文
若需要讓其他裝置都能瀏覽頁面,將 IP 改為 0.0.0.0 即可,與 ProFTPD 相同
php -S 0.0.0.0:8080

見下文
相同網路 裝置瀏覽該頁面

見下文
外部網路 裝置瀏覽該頁面

當然還要到 Router 設定 DMZPort Forward

見下文
輸入
sqlite3 test-sqlite3.db
CREATE TABLE `user` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `name` VARCHAR2(4) NOT NULL);
INSERT INTO `user` (`name`) VALUES ('Mr.A');
INSERT INTO `user` (`name`) VALUES ('陳大文');
.exit
使用 SQLite3 指令建立 sqlite3資料庫檔案sqlite3資料表加入資料
資料庫資料表資料 可以按閣下的需要調整
詳細 SQLite3指令 可以到 https://www.sqlite.org/cli.htmlhttps://www.sqlite.org/lang.html 查看

見下文
輸入
nano test-sqlite3.php
製作連接 SQLite3資料庫PHP 測試頁

見下文
輸入
<?php
$connection = new SQLite3('test-sqlite3.db');
$result = $connection->query('SELECT * FROM `user`;');
while (($row = $result->fetchArray(SQLITE3_ASSOC)) !== false){
    print_r($row);
}
$result->finalize();
$connection->close();
?>
然後儲存及離開

見下文
顯示結果

MariDBPostgreSQL 在安裝時發生錯誤

見下文
由於 MariaDB/usr/sbin/mysqld 出現 segmentation fault 導致 MariaDB伺服器 不能起動
MariaDB 的官方網頁亦表示 沒有提供支援 ARMhf 架構
因此在下下載 MariaDB 的源始碼自行編譯,但最後出現相同的錯誤
網上有提供 Maria for ARMDocker 但在下並未測試

見下文
PostgreSQL 則出現 FATAL: could not create shared memory segment: Function not implemented
看似由於 UserLAnd 未能提供 share memory 導致 PostgreSQL 不能起動
因此在下亦沒有詳細測試

若閣下能在 UserLAnd 解決 MariaDBPostgreSQL 起動問題,請告知在下

#################### NextCloud ####################

見下文
輸入
wget 'http://download.nextcloud.com/server/releases/latest.tar.bz2' -O 'nextcloud.tar.bz2'
tar jxvf 'nextcloud.tar.bz2'
下載 NextCloud 及解壓縮

見下文
解壓縮後,輸入
cd 'nextcloud'
php occ maintenance:install --database 'sqlite' --admin-pass 'password'
由於不能使用 MySQLMariaDBPostgreSQL 安裝 NextCloud ,因此需要使用 PHP指令 安裝
--admin-pass 為設定 NextCloud 管理員的密碼,若不在執行時加上會以互動方式設定
由於 NextCloud 需要使用 php-zipphp-xmlphp-mbstringphp-gdphp-curl
若未安裝,輸入
apt-get install php-zip php-xml php-mbstring php-gd php-curl

見下文
再輸入 php occ maintenance:install --database 'sqlite' 安裝
安裝時需要設定 admin (管理員) 帳戶密碼
完成後,輸入
php -S 127.0.0.1:8080
起動 NextCloud 測試
SQLite 的資料庫檔案會存放在 NextCloud 的 data 目錄中的 owncloud.db
(NextCloud 的前身是 OwnCloud)
備份相當容易

見下文
使用 網頁瀏覽器 瀏覽 http://127.0.0.1:8080/index.php
登入並初始化 NextCloud

見下文
第一次登入 NextCloud 會顯示歡迎使用訊息

見下文
NextCloud 有提供 Android 及 iOS 應用程式
使用 NextCloud應用程式 能較方便操作

見下文
執行 NextCloud應用程式
Server address https:// 輸入 127.0.0.1:8080
雖然寫著 https:// 但即使不使用 HTTPS 亦可以

見下文
Grant access 給予裝存取 NextCloud應用程式 權限

見下文
NextCloud應用程式 登入 NextCloud

見下文
允許 NextCloud應用程式 存取裝置檔案

見下文
載入至 NextCloud

#################### Neofetch ####################

見下文
輸入
file='/etc/apt/sources.list'
echo '' >>"${file}"
echo 'deb http://dl.bintray.com/dawidd6/neofetch buster main' >>"${file}"
curl 'https://bintray.com/user/downloadSubjectPublicKey?username=bintray' | apt-key add
apt-get update
apt-get install neofetch

見下文
安裝後輸入
neofetch
便可以顯示 ASCII Art 的 Debian 圖示及系統資料


#################### Webmin ####################

由於 UserLAnd 運行 Debian ,可以使用 Webmin 協助管理

見下文
輸入
w3m www.webmin.com
www.webmin.com Webmin 的官方網頁

見下文
進入 Download WebminDebian Package 頁面

見下文
見下文
見下文
下載 webmin*.deb
下載完成後離開
閣下亦可以使用 wget 之類直接輸入下載位置,省卻瀏覽過程

見下文
輸入
dpkg -i webmin*.deb
安裝 Webmin 但中途卻因為卻少部分 相依軟件 ,未能安裝
輸入
apt-get -f install
Debian 自動修正 相依軟件 問題及重新安裝 Webmin

Webmin 還可以使用 apt-get 方式安裝,安裝時會自動處理 相依套件
而且這種安裝方式還可以自動下載及更新最新版本
先輸入
apt-get install gnupg
安裝 GPG ,再輸入
file='/etc/apt/sources.list'
echo '' >>"${file}"
echo 'deb https://download.webmin.com/download/repository sarge contrib' >>"${file}"
curl 'http://www.webmin.com/jcameron-key.asc' | apt-key add
apt-get update
apt-get -y install webmin

見下文
完成安裝 Webmin 後輸入
service webmin restart
重新啟動 Webmin

見下文
見下文
使用 網頁瀏覽器 瀏覽 https://127.0.0.1:10000
由於 Webmin 使用自簽證書,出現安全問題
ADVANCED 再按 Proceed to 127.0.0.1 (unsafe) 迴避安全問題

見下文
顯示 Webmin 的登入頁面
需要使用 擁有管理員權限 的帳戶登入

見下文
顯示系統的 CPU用量記憶體用量儲存空間 等資訊

見下文
一些 Android 裝置還有 Virtual Memory (虛擬記憶體)

#################### XServer XSDL ####################

由於使用指令操作的確有或多或少的困難,雖然有不少 網頁介面 協助
但有 圖像使用者介面 (GUI) 還是比較方便

見下文
Play Store 安裝 XServer XSDL

見下文
第一次執行 XServer XSDL 會提示安裝字型
在下建議安裝
點選 Additional fonts 後按 OK

見下文
下載字型

見下文
安裝 XServer

見下文
安裝完成後,預設會以
原生解像度 (在下的 Android 原生解像度為 1920x1200)
0.7倍 字型大小
系統鍵盤 作為輸入工具
若不修改設定,會在5秒後以上次設定值執行 XServer XSDL

見下文
設定解像度
或選擇 custom 自訂解像度

見下文
設定字型大小
在下建議使用 1920x1200解像度 ,使用 0.3倍 字型大小
使用預設的 0.7倍 在 1920x1200解像度 會太大

見下文
設定輸入工具
可以使用預設值

見下文
XServer XSDL準備狀態
會以(恐怖的)藍底白字顯示操作說明

#################### LXDE ####################

見下文
由於一般 Android 裝置硬件能力不高,因此使用較少硬件需要的 LXDE
輸入
apt-get install lxde
安裝 LXDE
lxde 為完全安裝的 LXDE ,若只需要基本安裝可以將 lxde 修改為 lxde-core 體積較小,安裝時間亦較短

見下文
安裝途中會查詢安裝的鍵盤模式,建議使用 English US

見下文
查詢是否將帳加入至 netdev 群組
WicdWireless Interface Connection Daemon 的簡稱
NetworkManager 之類提供 管理網絡 的功能
雖然名稱為 Wireless (無線) 但事實上 Wicd 亦能夠管理有線網絡
讓加入至 netdev 的帳戶能夠 管理網絡

見下文
安裝完成後,輸入
export DISPLAY=:0
startlxde
畫面 匯出,並啟動 LXDE

見下文
回到 XServer XSDL 便接收並顯示 LXDE 的介面
使用者可以使用 藍芽滑鼠 移動遊標,方便操作
若要關閉 GUI 回到 ConnectBotCtrl C 停止 startlxde 便可以,不需要在 GUI 執行 關機登出 操作

見下文
實作效果

#################### LibreOffice Online ####################

見下文
由於 Debian 10Node.js 套件 不包含 Node Package Manager (npm)
因此需要使用由 Node.js 官方提供的套件
輸入
curl -sL 'https://deb.nodesource.com/setup_10.x' | bash -
加入由 Node.js 官方提供的 Node.js 套件來源

見下文
輸入
apt-get install automake g++ git libboost-dev libcap-dev libcppunit-dev libkrb5-dev libpam0g-dev libpng-dev libpoco-dev libreoffice libreoffice-dev libseccomp-dev libtool m4 make nasm nodejs pkg-config python-polib
見下文
留意
Debian 10 的 libpoco-devlibreofficelibreoffice-dev 才能編譯 LibreOffice Online
否則需要用極多時間編譯 POCO 及 LibreOffice
(參巧:NextCloud 與 LibreOffice Online 整合)

見下文
安裝 Node.js 後同樣需要安裝 npm 的 jake套件
輸入
npm install jake

見下文
由 Debian 提供的 libpoco-dev 的檔案放在 /usr/lib/libPoco*.so.*
由於編譯 LibreOffice Online 的 POCO 需要以 libPoco*d.so 的方式命名
到 /usr/lib 輸入
for f in libPoco*.so.*; do ln -s "${f}" `echo "${f}" | sed -r 's/\.so\..+$/d.so/g'`; done

見下文
回到使用者目錄,輸入
git clone git://anongit.freedesktop.org/libreoffice/online.git --depth=1
下載 LibreOffice Online 源始碼
由於 LibreOffice Online 經過多次更新,由發行版提供的 libreoffice-dev 未必夠用
使用由 LibreOffice Online 提供的 bunbled/include/LibreOfficeKit 才能順利編譯
可以複製 bunbled/include/LibreOfficeKit 到其他位置使用,例如 /opt/libreoffice

見下文
到 LibreOffice Online 目錄輸入
bash autogen.sh
UserLAnd 不允許自建檔案擁有執行權限,即使 chmod +x 都不能
因此調用 bash 來執行 shell script 之類檔案

見下文
見下文
輸入
bash configure --prefix=/opt/libreoffice/online --with-lo-path=/usr/lib/libreoffice --with-lokit-path=/opt/libreoffice --with-poco-includes=/usr/include/Poco --with-poco-libs=/usr/lib --enable-debug --disable-seccomp --disable-setcap
由於 UserLAnd 不能設定 seccomp 及 setcap
因此設定編譯資料時使用 --disable-seccomp--disable-setcap 不使用 seccomp 及 setcap

見下文
編輯 wsd/LOOLWSD.cppthrow std::runtime_error("Do not run as root. Please run as lool user."); 取消
便可以讓 LOOLWSD 以 root 執行
或輸入
file="wsd/LOOLWSD.cpp"
mv "${file}" "${file}.bak"
cat "${file}.bak" |\
sed -r 's/(throw.+lool user.+;)/\/\/ \1/g' >"${file}"

見下文
輸入
make
編譯 LibreOffice Online

編譯時間不久便會出現錯誤
由於在下使用的 Android 裝置是 32-bit 結構,但 LibreOffice Online 源始碼只支援 64-bit 結構
因此需要將源始碼改成完支援 32-bit 結構

見下文
見下文
編輯 net/WebSocketHandler.hpp ,將
out.push_back(static_cast<char>((len >> 56) & 0xff));
out.push_back(static_cast<char>((len >> 48) & 0xff));
out.push_back(static_cast<char>((len >> 40) & 0xff));
out.push_back(static_cast<char>((len >> 32) & 0xff));
或輸入
file="net/WebSocketHandler.hpp"
mv "${file}" "${file}.bak"
cat "${file}.bak" |\
sed -r 's/(out\.push_back\(static_cast<char>\(\(len >> (56|48|40|32)\) & 0xff\)\);)/\/\/ \1/g' >"${file}"
取消

見下文
見下文
編輯 common/Protocol.hpp ,將
const size_t pos = getDelimiterPosition(message.data(), std::min(message.size(), 500UL), '\n');
改成
const size_t pos = getDelimiterPosition(message.data(), std::min((long unsigned int) message.size(), 500UL), '\n');
或輸入
file="common/Protocol.hpp"
mv "${file}" "${file}.bak"
cat "${file}.bak" |\
sed -r 's/(const size_t pos = getDelimiterPosition\(message\.data\(\), std::min\()(message\.size\(\).+))/\1(long unsigned int) \2/g' >"${file}"

見下文
見下文
編輯 wsd/TraceFile.hpp ,將
fprintf(stderr, "Invalid trace file with %ld records. First record: %s\n", _records.size(),
改成
fprintf(stderr, "Invalid trace file with %ld records. First record: %s\n", (long unsigned int) _records.size(),
或輸入
file="wsd/TraceFile.hpp"
mv "${file}" "${file}.bak"
cat "${file}.bak" |\
sed -r 's/(fprintf\(stderr, "Invalid trace file with %ld records\. First record: %s\n", )(_records\.size\(\).+)/\1(long unsigned int) \2/g' >"${file}"

見下文
編輯 test/TileQueueTests.cpp
由於 錯誤量相當多 ,一個一個改會比較麻煩,因此可以使用 Regex 方式修改

見下文
若果使用 nano 編輯
Ctrl \ ,進入 取代模式

見下文
再按 Meta RAlt R,進入 Regex 取代模式
搜尋目標,輸入
(CPPUNIT_ASSERT_EQUAL\([0-9]+UL, )(.+)

見下文
取代目標,輸入
\1(long unsigned int) \2

見下文
若找到目標會顯示,按 A 便可以全部取代

見下文
取代所有符合的內容

或輸入
file="test/TileQueueTests.cpp"
mv "${file}" "${file}.bak"
cat "${file}.bak" |\
sed -r 's/(CPPUNIT_ASSERT_EQUAL\([0-9]+UL, )(.+)/\1(long unsigned int) \2/g' >"${file}"

見下文
見下文
見下文
見下文
繼續編譯時都會有相似的問題,可以用同樣方便取代
留意 編輯的檔案名稱需要取代的內容 會不同
或輸入
file="test/WhiteBoxTests.cpp"
mv "${file}" "${file}.bak"
cat "${file}.bak" |\
sed -r 's/(CPPUNIT_ASSERT_EQUAL\([0-9]+UL, )(.+)/\1(long unsigned int) \2/g' >"${file}"

見下文
大約使用了 6小時 終於編譯完成

見下文
編輯 loolwsd.xml
SSLseccompsetcap 設定為 false
host allow 設定為 .+

見下文
輸入
make run
執行 LOOLWSD
同樣,根據需要是否安裝

見下文

http://localhost:9980/loleaflet/dist/admin/admin.html 顯示管理頁面

見下文
見下文
到範例頁面,卻不能正常顯示文件內容,即使在電腦連至該頁面,都不能正常顯示文件內容
但在下在 VirtualBox 使用 Debian 10 32-bit 卻能正常使用,或許是在下的 Android 裝置的性能太差導致
在下相信 LibreOffice Online 能夠於 UserLAnd 運作
有機會購買性能較強的 Android 裝置會再測試

#################### 保留檔案 ####################

Linux 可以到 /host-rootfs/storage/emulatord/0 存取 Android 的資料
如果閣下保留 Filesystem 的檔案,可以將檔案複製到原本 Android可存取的空間 ,否則刪除 Filesystem 便 不能復原檔案
相反亦可以從 Android可存取的空間 傳送檔案到 Linux 的 Filesystem直接存取檔案

見下文
見下文
見下文
見下文
可以使用 cp (複製)mv (移動) 這些指令,將檔案傳送到 Android可存取的空間
輸入
cp 'some-file' '/host-rootfs/storage/emulatord/0/'
便可以將檔案複製到 Android可存取的空間
使用 GUI 操作亦可以

以上設置大約使用了 8GB 空間
部分功能不能使用,部分套件亦不能正常運作
但若以功能及流動性來說,基本上可以當作個人電腦或伺服器一般使用,有點像 Raspberry Pi
另外若將 Android 的熒幕關閉,回應速度會很慢
但當熒幕長期開啟,某些高運算操作(例如編譯)電耗量會很高,即使接駁電源線,電量仍有機會下降
這個專案可以讓 Android 發揮更大功效
如果本身有使用 Linux ,很快便可以將 Android 裝置當作電腦使用
如果本身未使用 Linux 或嘗試接觸電腦科技知識,是一個簡單的學習渠道
在下認為 UserLAnd 還有很多發揮空間,由閣下發掘更多可能性

詳細資料可以到 https://github.com/CypherpunkArmory/UserLAnd 查看

沒有留言 :

張貼留言