拥抱现代:在国产操作系统RT-Thread体验tmux终端复用的魅力

引言


在嵌入式平台性能飞速发展的时代,市场上如雨后春笋般涌现出各类高性能高性价比的新兴平台,为我们的开发带来了诸多便利。RT-Thread Smart 正是为更好地利用这些性能优势而生的一款解决方案。通过它,我们可以轻松复用丰富的 RT-Thread Smart 系统组件以及 POSIX ,UNIX,GNU 生态的软件栈,实现更高效的验证和功能开发。

091ffebcffd9ce67dbea08fbc75f4378.png

我们通过终端环境中功能强大的终端多路复用工具 tmux 作为引子,在本文里展示众多丰富的组件在多窗口多终端及远程登陆应用上的实际体验,同时了解RT-Thread Smart 系统对复杂应用依赖的各类基础设施提供的完善支持。

在正文开始前,我们可以通过以下的视频对这些功能的效果一睹为快。

上图展示了通过终端工具 ssh 远程登录到 RT-Thread Smart 系统,并绑定一个原先创建,正在运行中的会话的效果。左边窗口中通过 top 工具实时观测系统占用率,右边则是运行中的 tar 打包和 bz2 压缩任务。同时,我们创建了一个新的窗口,执行了一个 ps 命令。

tmux 简介


Tmux 是一个终端复用器,允许用户在一个终端会话中管理多个终端会话。用户可以在一个窗口中分割多个面板、创建多个窗口、以及在不同会话之间切换。更重要的是,它可以在会话分离后继续运行任务,并在会话重新连接时恢复原来的状态(正如我们在开篇中的视频里展现的那样)。这使得它非常适合需要同时处理多个任务和长时间运行任务的用户。

配置远程终端服务


rt-smart 已经支持基于 Dropbear 的SSH 服务器,从而可以使用主机电脑用SSH远程登录来使用板端Smart操作系统。

https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-smart/introduction/rt-smart-experiences/rt-smart-experiences?id=%e6%8a%a2%e5%85%88%e9%a2%84%e8%a7%88

smart上手体验 (rt-thread.org)

从以上链接可以获取 smart-prebuild预构建镜像。使用 prebuilt 版本启动系统后,可以在 /etc/inittab中看到如下内容:

e29b7605bc6231e94b58fa4bd4cd14ca.png其中含有dropbear的启动命令/bin/dropbear -F 2>/root/dropbear.log,故系统启动时自动启动dropbear ssh服务器。qemu启动脚本则将qemu的22号端口映射到主机58080端口。

新建Tmux 会话与脱离


第一个启动的 Tmux 窗口,编号是0,第二个窗口的编号是1,以此类推。这些窗口对应的会话,就是 0 号会话、1 号会话。当然,使用编号区分会话不太直观。因此我们也可以为会话起名,便于记忆。

tmux new-s <session-name>

使用上面的命令就可以创建一个指定名称的会话。下图展示了这个命令的使用。在创建会话后,我们可以如同普通 shell 那样在tmux 中执行命令。

此外,在执行脚本的过程中,按下Ctrl+b d或者输入tmux detach -t <num>/<name>命令,就会将当前会话与窗口分离。但是会话和里面的进程仍然在后台运行。使用结果如同上图最后操作的那样,我们会看到 tmux 打印 “detached (from session test)”。同时,终端回到 shell 程序控制。

连接先前创建的 Tmux 会话


tmux attach -t  <num>/<name>

我们使用上面的命令接入先前创建的会话。这时终端回到原有的会话现场。这给我们检查之前创建的管道状态提供了巨大便利。

下图展示了会话创建后脱离并重新连接的过程:

我们先使用tmux new-s hello 命令创建了一个名为hello的会话,接着使用Ctrl+b d 组合键将当前会话与窗口分离,接着又使用tmux attach -t hello接入hello会话现场。这时我们可以看到脚本仍在正常执行。

6d78062a668265038d00c4a84c640aad.png

tmux switch  -t  <name>/<num>

此外,当我们创建了多个会话时,可以通过tmux switch 来切换不同的会话。这里以hello 为例子。

上图中可以看到成功切换到hello,里面的进程仍在运行

80ab83cde26ccc55f5158d4aaee82aa4.png

tmux rename-session -t  <name> /<num>  <new-name>

此外,我们还可以通过命令重命名已经创建的会话。

对于不想要的会话也可以通过tmux kill-session -t <name>/<num>来结束掉。当会话结束后,我们使用 tmux ls 命令就看不到 test2 会话了,并且也不能用attach再进行连接。

Tmux 窗格管理


Tmux 可以将窗口分成多个窗格(pane),每个窗格运行不同的命令。以下命令都是在 Tmux 窗口中执行。

● 使用tmux split-window可以划分上下两个窗格,tmux split-window -h可以划分为左右两个窗格。

● 窗格划分后,可以通过tmux select-pane -U/D/L/R 命令移动光标位置,或者使用快捷键 ctrl+b <arrow key>。

下面是窗格管理的快捷键使用大全:

Ctrl+b %:划分左右两个窗格。
Ctrl+b ":划分上下两个窗格。
Ctrl+b <arrow key>:光标切换到其他窗格。<arrow key>是指向要切换到的窗格的方向键,比如切换到下方窗格,就按方向键↓。
Ctrl+b ;:光标切换到上一个窗格。
Ctrl+b o:光标切换到下一个窗格。
Ctrl+b {:当前窗格与上一个窗格交换位置。
Ctrl+b }:当前窗格与下一个窗格交换位置。
Ctrl+b Ctrl+o:所有窗格向前移动一个位置,第一个窗格变成最后一个窗格。
Ctrl+b Alt+o:所有窗格向后移动一个位置,最后一个窗格变成第一个窗格。
Ctrl+b x:关闭当前窗格。
Ctrl+b !:将当前窗格拆分为一个独立窗口。
Ctrl+b z:当前窗格全屏显示,再使用一次会变回原来大小。
Ctrl+b Ctrl+<arrow key>:按箭头方向调整窗格大小。
Ctrl+b q:显示窗格编号。`在这里插入代码片`

下面展示使用快捷键分割窗口和切换光标位置的过程:

Tmux 窗口管理


除了将一个窗口划分成多个窗格,Tmux 也允许新建多个窗口。我们可以使用 tmuxnew-window命令创建新窗口,通过tmux select-window -t <num> 命令用来切换窗口,通过tmux rename-window命令用于为当前窗口起名(或重命名)。

这些命令同样有快捷键替代:

Ctrl+b c:创建一个新窗口,状态栏会显示多个窗口的信息。
Ctrl+b p:切换到上一个窗口(按照状态栏上的顺序)。
Ctrl+b n:切换到下一个窗口。
Ctrl+b <number>:切换到指定编号的窗口,其中的<number>是状态栏上的窗口编号。
Ctrl+b w:从列表中选择窗口。
Ctrl+b ,:窗口重命名。

使用快捷键进行窗口的创建,切换,重命名过程如下:

同样如果想要关闭某个窗格可以使用Ctrl+b x组合命令,这里不再演示

tmux 中使用 scp 实现安全文件传输


RTT内核用作ssh服务器,我们就可以通过scp来向其传输文件。以通过终端工具传输 mksd 脚本为例。我们首先配置好 RT-Smart 服务器的地址和用户名,密码。然后可以直接拖动客户端操作系统上的文件到左侧文件系统视窗中。此时会自动建立 scp 进程完成文件拷贝。

在 Tmux 背后是……


Tmux 的这些强大功能依赖于操作系统的几个核心机制。首先是会话和进程组,Tmux 利用这些机制来管理和组织不同的终端会话和进程。每个 Tmux 会话可以包含多个窗口,而每个窗口又可以包含多个进程,这些进程被组织成进程组,以便统一管理。

其次,终端和伪终端是 tmux 实现多窗口和分割面板的基础。伪终端提供了一个虚拟终端设备,使得用户可以创建和管理多个虚拟终端,这些终端可以独立运行并显示各自的输出。

此外,Tmux 是一个基于前后端架构的应用。前端负责用户输入和显示输出,而后端负责实际的任务管理和执行。前后端通信及异步事件处理也依赖于 libevent 库。libevent 是一个轻量级的事件驱动编程库,它基于 Unix 域套接字(UDS)、netlink 等基础设施,为进程间双工通信、多播和内核异步事件通知提供了高效的实现。这使得 tmux 能够在需要处理大量并发事件时,依然保持高效、稳定的运行。

信号处理也是 tmux 功能的关键部分。Tmux 可以在会话分离和重新连接时通过内核提供的 SIGCONT、SIGSTOP 等POSIX 作业控制信号正确地管理和恢复进程状态,确保任务能够持续运行而不受干扰

cdc4a94a5751155f14012baf8ef44db7.png

上图总结了 Tmux 在 RT-Thread Smart 的运行环境中的各类软硬件组件。它们保证了 RT-Thread Smart在多个方面为程序应用提供了便利和灵活。无论是进程间通信、与内核进行信息交换、还是通过netlink 处理异步事件,抑或是通过伪终端与终端仿真器进行交互,用户程序都能够更加轻松地操作系统,提高工作效率。RT-Smart 系统提供的丰富系统组件为嵌入式开发带来了更多可能性,让我们在这个快速发展的技术世界中走得更快、更远。

结语


本文我们介绍了 RT-Thread Smart 系统在支持复杂应用方面的强大能力。从多窗口终端管理的 tmux 到远程登录的 SSH,RT-Thread Smart 展现了其在嵌入式开发中的灵活性和高效性。

希望通过本文,能够让更多的开发者了解并使用 RT-Thread Smart,在这个充满活力的平台上实现更多精彩的应用。让我们一起期待,在未来的嵌入式开发旅程中,RT-Thread Smart 将继续为我们带来更多惊喜和便利。

64c0863a8e0b744a0b758da3ca1bc3c0.png

欢迎大家在 RT-Thread Github 仓库或论坛上向我们反馈意见和建议。另外,如果您对参与到 RT-Thread 的平台支持(risc-v、arm、arm64 平台上的驱动、内核代码完善)、应用移植与开发、文档维护感兴趣,我们诚邀您加入 Smart 兴趣小组,参与到与 Smart 相关的开源贡献中。

最后是次回预告。我们计划在下一篇文章为大家分享 RT-Thread Smart 在多核平台上的实时性能表现。如果您感兴趣还请持续关注。

——————End——————

177860e1dca88ce3b2254a8ef2599eb6.jpeg

f5030119a6fbc593429aadc5d5dc84f8.gif

👇 点击阅读原文进入官网

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值