termux制作用于在chroot环境下启动Debian系统并配置和启动VNC服务的脚本

由于每次启动桌面环境,都需要重复几个步骤,因此可以写一个启动脚本来简化启动步骤.

编写自定义usr/bin脚本

1
2
3
cd $PATH
#Termux的PATH环境变量默认只包含/data/data/com.termux/files/usr/bin/这一个值,因此可以使用环境变量代替路径名快速导航过去
nano startchrootvnc

输入以下内容并保存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/bin/bash
# 声明使用bash作为脚本解释器


killall -9 termux-x11 Xwayland virgl_test_server_android termux-wake-lock
# 终止所有相关的旧进程
# 以下进程可能是之前运行残留的,为确保新的启动不受影响,强制终止它们
# termux-x11:Termux环境下X11相关进程
# Xwayland:用于在Wayland上运行X11客户端的兼容层进程
# pulseaudio:音频服务器进程
# virgl_test_server_android:可能与Android虚拟图形测试服务器相关的进程
# termux-wake-lock:可能用于保持设备唤醒状态的Termux相关进程


#am start --user 0 -n com.termux.x11/com.termux.x11.MainActivity
# 启动Termux X11(此am start命令被注释,未启用)
# am start是Android的Activity Manager命令,用于启动Android应用组件
# --user 0指定用户ID为0
# -n com.termux.x11/com.termux.x11.MainActivity指定要启动的应用包名和Activity名


sudo busybox mount --bind $PREFIX/tmp /data/SubSystem/chrootDebian/tmp
# 将Termux的临时目录挂载到Debian chroot环境的临时目录
# sudo用于获取超级用户权限,因为挂载操作通常需要root权限
# busybox是一个集成多种Unix工具的软件,在Termux环境中常用
# mount --bind用于将一个目录绑定挂载到另一个目录
# $PREFIX/tmp是Termux的临时目录,$PREFIX通常是Termux的安装前缀
# /data/SubSystem/chrootDebian/tmp是Debian chroot环境中的临时目录
# 这样做可使Debian chroot环境访问Termux的临时目录,便于数据共享


XDG_RUNTIME_DIR=${TMPDIR} termux-x11 :0 -ac &
# 设置XDG_RUNTIME_DIR环境变量为系统临时目录$TMPDIR
# 许多基于XDG规范的应用程序使用XDG_RUNTIME_DIR存储运行时数据
# termux-x11启动Termux环境下的X11服务器
# :0指定X11服务器的显示设备编号为0,通常代表第一个显示设备
# -ac选项禁用访问控制,允许任何客户端连接到X11服务器
# &符号将该命令放在后台运行,使脚本继续执行后续命令


sleep 3
# 等待3秒,给X11服务器足够时间启动和初始化
# 确保后续依赖X11服务器的操作能正常进行


pulseaudio --start --load="module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1" --exit-idle-time=-1
# 启动Termux的PulseAudio音频服务器
# --start启动PulseAudio服务器
# --load="module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1"加载TCP协议模块
# 并配置该模块允许来自本地环回地址127.0.0.1的匿名连接
# --exit-idle-time=-1使服务器永远不会因空闲而退出

pacmd load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1
# 使用PulseAudio的命令行管理工具pacmd再次加载TCP协议模块
# 并设置相同的访问控制参数,确保配置生效


#virgl_test_server_android &
# 启动Virgl服务器(此命令被注释,未启用)
# virgl_test_server_android可能是用于Android的虚拟图形测试服务器程序
# &符号将其放在后台运行


su -c "sh /data/SubSystem/start_debian_vnc_1400_830.sh"
# 以超级用户身份执行Debian VNC启动脚本
# su用于切换用户,不加用户名默认切换到root
# -c选项表示切换用户后执行一个命令
# sh /data/SubSystem/start_debian_vnc_1400_830.sh指定要执行的脚本路径
# 此脚本用于在chroot环境下启动Debian系统,并配置和启动VNC服务

接下来编写 start_debian_vnc_1400_830.sh 脚本:

为什么要另外写一个start_debian_vnc_1400_830.sh 脚本? 因为以上脚本内容执行权限是普通用户,以下脚本需要用root执行.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/bin/sh
# 声明使用POSIX兼容的sh shell来执行脚本


DEBIANPATH="/data/SubSystem/chrootDebian"
# 定义Debian根文件系统的路径
# 后续操作将基于此路径对Debian环境进行配置和交互


busybox mount -o remount,dev,suid /data
# 修复setuid相关问题
# 使用busybox的mount命令重新挂载/data分区
# -o remount选项表示重新挂载已挂载的文件系统
# dev选项重新启用设备节点的支持
# suid选项重新启用设置用户ID(set - user - ID)和设置组ID(set - group - ID)位
# 这一步确保后续在/data分区上的操作具有正确的权限设置


busybox mount --bind /dev $DEBIANPATH/dev
# 将宿主机的关键目录绑定挂载到Debian根文件系统对应的目录
# 使Debian系统能够访问宿主机的设备、内核信息和进程信息
# 绑定挂载/dev目录,/dev包含设备文件,Debian需要通过它访问硬件设备


busybox mount --bind /sys $DEBIANPATH/sys
# 绑定挂载/sys目录,/sys提供内核对象的层次结构信息,供Debian系统获取硬件和驱动相关信息


busybox mount --bind /proc $DEBIANPATH/proc
# 绑定挂载/proc目录,/proc是虚拟文件系统,包含内核和进程的相关信息,Debian借此获取系统状态和进程信息


busybox mount -t devpts devpts $DEBIANPATH/dev/pts
# 挂载devpts文件系统到Debian根文件系统的/dev/pts目录
# devpts用于管理伪终端(PTY),支持Debian系统中多终端会话的运行


mkdir $DEBIANPATH/dev/shm
# 为Electron应用程序设置/dev/shm
# /dev/shm常用于进程间共享内存,许多应用程序(包括Electron应用)用它提升性能
# 创建Debian根文件系统中的/dev/shm目录



busybox mount -t tmpfs -o size=256M tmpfs $DEBIANPATH/dev/shm
# 使用busybox的mount命令挂载tmpfs文件系统到/dev/shm目录
# -t tmpfs指定文件系统类型为tmpfs,这是一种基于内存的文件系统
# -o size=256M设置tmpfs的大小为256MB




mkdir $DEBIANPATH/sdcard
# 创建Debian根文件系统中的sdcard目录,用于挂载SD卡


busybox mount --bind /sdcard $DEBIANPATH/sdcard
# 使用busybox的mount命令将宿主机的/sdcard目录绑定挂载到Debian根文件系统的sdcard目录
# 使Debian系统能够访问SD卡上的内容



busybox chroot $DEBIANPATH /bin/su - alin -c 'export DISPLAY=:1 && export PULSE_SERVER=127.0.0.1:4713 && dbus-launch --exit-with-session && tightvncserver :1 -geometry 1400x830'
# 以用户alin的身份进入chroot环境,设置显示和音频服务器相关变量,启动dbus并启动xfce4桌面环境
# 设置DISPLAY环境变量为:1,指定X11显示服务器地址,后续图形化应用将使用此显示
# 设置PULSE_SERVER环境变量,指定PulseAudio音频服务器地址为本地环回地址127.0.0.1的端口4713
# 启动D-Bus会话总线,--exit-with-session选项表示当会话结束时退出D-Bus
# 启动TightVNC服务器,监听显示号:1,设置分辨率为1400x830
# 使得可以通过网络远程访问Debian环境中的图形化桌面

使用 Ctrl+O触发保存,确定写入的文件名为 startchrootvnc按回车继续,然后使用 Ctrl+X退出文本编辑器
使用以下命令为脚本添加执行权限
chmod +x startchrootvnc
完成以上步骤即可随时使用 startchrootvnc 命令启动桌面环境