Linux运维笔记：修复 ThinLinc 会话数据库损坏问题 ThinLinc 在多用户 Linux 工作站中的重要性 问题发现：会话数据库损坏 解决： 1. 备份数据 2.删除损坏的数据库文件 3.重启服务 4.重新检查 5.验证修复 总结 Linux运维笔记：修复 ThinLinc 会话数据库损坏问题 ThinLinc 是一个优秀的远程桌面解决方案，它让用户能够方便地访问工作站，运行复杂计算任务或进行数据分析。然而，最近我们遇到一个问题：ThinLinc 客户端无法成功连接至工作站。排查发现是 ThinLinc 的核心服务 vsmserver.service 启动失败，导致用户无法登录。经过进一步排查，发现问题源于会话数据库损坏，并成功解决了它。 ThinLinc 在多用户 Linux 工作站中的重要性 实验室的工作站通常需要配置高性能硬件，运行专业软件，但用户分布在不同地点。ThinLinc 通过虚拟会话管理（VSM）提供流畅的远程访问体验，让用户无需物理接触工作站即可完成工作。VSM 服务器（vsmserver.service）是 ThinLinc 的核心组件，负责协调用户会话。如果它出现故障，整个远程访问系统就会瘫痪。 最近，我们注意到用户反馈无法连接到工作站。运行 systemctl list-units --type=service 检查后，发现 vsmserver.service 状态为 loaded failed failed，详细情况如下所示： root@ccccs-Z790-UD-AX:/home/ccccs# systemctl list-units --type=service ... vsmagent.service loaded active running ThinLinc VSM agent vsmserver.service loaded failed failed ThinLinc VSM server whoopsie.service loaded active running crash report submission daemon ... 此时通过 systemctl 命令尝试重启该服务，发现仍不能成功启动... 问题发现：会话数据库损坏 首先查看了系统日志： sudo journalctl -u vsmserver.service 日志显示服务在启动后立即退出，状态码为 status=1/FAILURE，但没有具体错误详情。接着转向 ThinLinc 的专用日志文件： sudo cat /var/log/vsmserver.log 2025-04-14 12:26:52 INFO vsmserver: VSM Server version 4.15.0 build 3358 started 2025-04-14 12:26:52 ERROR vsmserver: Error loading session database: Error unpacking /var/lib/vsm/sessions (invalid load key, '\x00'.) 2025-04-14 12:26:52 ERROR vsmserver: Session database needs manual recovery. 2025-04-14 12:26:52 ERROR vsmserver: Exiting 发现是 /var/lib/vsm/sessions 文件损坏，导致 VSM 服务器无法加载会话数据库并退出。 这个错误提示 invalid load key, '\x00' 通常表示文件内容不完整或被意外修改，可能是磁盘问题、异常关机或软件 bug 导致。(工作站会偶尔发生断电或人为重启) 解决： 1. 备份数据 sudo cp -r /var/lib/vsm/sessions /var/lib/vsm/sessions.bak 2.删除损坏的数据库文件 ThinLinc 文档指出，损坏的 /var/lib/vsm/sessions 文件可以安全删除，服务器会在下次启动时自动重新创建。我们执行： sudo rm /var/lib/vsm/sessions 注意：删除会话数据库会清除当前会话记录，可能导致用户丢失未保存的会话状态。在我们的场景中，实验室用户主要运行短期任务，影响较小，但也要确保此时每人连接。 3.重启服务 sudo systemctl start vsmserver.service 4.重新检查 systemctl list-units --type=service # 启动成功 vsmserver.service loaded active running ThinLinc VSM server 5.验证修复 让用户通过他们本地 ThinLinc 客户端登录工作站，确认远程桌面功能完全恢复。 总结 定期备份：虽然 ThinLinc 的会话数据库可以重建，但备份 /var/lib/vsm/ 文件夹能降低风险。可每周自动备份。 监控磁盘健康：数据库损坏可能与磁盘错误有关。运行 df -h /var/lib/vsm 和 fsck 检查文件系统是个好习惯。 检查日志：journalctl 和 /var/log/vsmserver.log 是诊断 ThinLinc 问题的关键。熟悉这些工具能大大加快故障排除。 远程桌面系统的稳定性对用户体验至关重要。通过系统化的诊断和谨慎的操作，大多数问题都可以迎刃而解。
开源｜ThingsBoard 快速开发物联网可视化大屏和驾驶舱的方式方法
前言 在物联网开发中对于数据可视是必须的一项工作，大家都清楚国内对于很数据驾驶仓和大屏展示有着效高的需求，如果用传统的方式来可视化需要逐句代码编写进行实现，这使得开发工作内容繁重且重复很多还不能应对各种需求的变化， 如果我们使用ThingsBoard的可视化进行开发这样就会极大的减少工作量提高效率和产出，我们可以通过部件方式将传统的HTML，JS，CSS进行代码开发做成自定义基础部件为后面我们的可视化添砖加瓦，效果图如下 创建部件 导航部件库然后打开现有的部件包或创建一个新在部件包视图中单击屏幕右下角的大“ +”按钮然后单击“创建新的窗口部件类型”按钮。 选择部件 选择窗口部件类型会弹出窗口选择你要开发的相应部件类型之后将根据先前选择的窗口部件类型打开“窗口部件编辑器”页面，该页面预填充了启动器窗口部件模板。 编辑器 编辑器由工具栏和四个主要部分组成： HTML面板：可以添加CSS，JS相关代码 JavaScript：编写一些JS函数 设置：主要是JSON代码用于在部件中设置一些个性配置 预览：类型于仪表板的形式展示当前窗口部件 部件API 所有与部件相关的代码都位于JavaScript部分并提供了对部件实例的引用的内置变量self部件函数都必须定义主self变量的属性，self变量有ctx属性引用部件实例使用的所有API和数据的WidgetContext上下文对象。 参见以下表格： 属性 类型 描述 $container jQuery Object 部件的容器元素。可用于使用jQuery API动态访问或修改部件DOM。 $scope 动态部件组件 当前部件元素的角度范围对象。使用Angular方法构建窗口小部件时，可用于访问/修改范围属性。 width Number 部件容器的当前宽度（以像素为单位）。 height Number 部件容器的当前高度（以像素为单位）。 isEdit Boolean 指示仪表板是处于视图状态还是处于编辑状态。 isMobile Boolean 指示仪表板视图是否小于960px宽度（默认移动断点）。 widgetConfig Object 常见的窗口小部件配置，其中包含诸如颜色（文本颜色），backgroundColor（小部件背景颜色）等属性。 settings Object 根据定义的json模式包含小部件特定属性的小部件设置 units String 定义窗口小部件显示的值的单位文本的可选属性。对于简单的小部件（如卡片或仪表）很有用。 decimals Number 可选属性，用于定义应使用多少个位置来显示数值的小数部分。 hideTitlePanel Boolean 管理窗口小部件标题面板的可见性。对于具有自定义标题面板或不同状态的小部件很有用。 widgetTitle String 如果设置，将覆盖配置的窗口小部件标题文本。更改此属性后，必须调用updateWidgetParams（）函数。 detectChanges() Function 介绍触发当前小部件的更改检测。由于窗口小部件数据更改而应更新窗口小部件HTML模板绑定时，必须调用此方法。 updateWidgetParams() Function 介绍使用运行时集属性（例如widgetTitle，hideTitlePanel等）更新小部件。必须调用这些属性才能使这些属性更改生效。 defaultSubscription Object 请参阅对象订阅 timewindowFunctions Object 请参阅Timewindow功能 controlApi Object 请参阅Control API actionsApi Object 请参阅Actions API stateController Object 请参阅状态Controller datasources 数组<数据源> 解析的窗口小部件数据源的数组。请参见订阅对象. 函数说明 函数 描述 onInit() 当widget准备好初始化时调用的第一个函数。应该用于准备小部件DOM，处理小部件设置和初始订阅信息。 onDataUpdated() 在部件订阅中有新数据可用时调用。可以从窗口部件上下文（ctx）的defaultSubscription object访问最新数据。 onResize() 调整窗口小部件容器的大小时调用。可以从窗口小部件上下文（ctx）获得最新的宽度和高度。 onEditModeChanged() 更改仪表板编辑模式时调用。最新模式由ctx的isEdit属性处理。 onMobileModeChanged() 当仪表板视图宽度超过移动断点时调用。最新状态由ctx的isMobile属性处理。 onDestroy() 当部件元素被销毁时调用。如有必要，应使用它来清理所有资源。 getSettingsSchema() 返回窗口小部件设置架构json的可选函数以替代设置部分的设置标签。 getDataKeySettingsSchema() 返回特定数据密钥设置方案json的可选函数，替代设置部分Settings schema section的数据密钥设置方案标签。 typeParameters() 检索描述窗口小部件数据源参数的对象。请参阅类型参数对象类型参数对象。 actionSources() 调用对象，该对象描述用于定义用户操作的可用窗口小部件操作源。请参阅操作源对象。 部件开发 通过对前面了我们可以根据自身的需求开发一个部件，这里小编用一个静态部件展示开发过程。 编写HTML {{text}} 编写JSON { "schema": { "type": "object", "title": "Settings", "properties": { "text": { "title": "标题文本", "type": "string", "default": "可视化大屏" }, "font_size": { "title": "标题字号", "type": "integer", "default": "18" } } }, "form": [ "text", "font_size" ] } 编写JavaScript self.onInit = function() { var settings=self.ctx.settings; self.ctx.$scope.text = settings.text || "可视化大屏";//京州省智慧城市大屏 self.ctx.$scope.font_size = settings.font_size || 48; } 效果图 注意事项： 如果部件中用到的静态资源（图片，css）可以放在前端项目 设置有时候可能不正确，请多尝试几次。 关于 亿琪软件 上海亿琪软件有限公司成立于2016年，专注于 5G 通信、AI 人工智能、边缘计算和大数据网络安全多项技术领域，致力于物联网领域前沿技术的创新，为用户提供全方位、智能化和安全的物联网解决方案。 2023年，公司发布“YiFUSION｜工业边缘智能融合一体机”产品，为工业客户提供一整套的边缘计算+AI能力：高性能数据采集、多类型数据融合、AI算法集成、云端业务对接。在边缘网关的基础上，集成了 IoT 平台的边缘协同能力、本地Web SCADA 和 HMI 功能、本地数据存储、边缘 AI 视频分析、行业应用集成等。 2022年公司推出 “YiCLOUD｜亿琪云”一站式物联网应用解决方案。公司的业务涵盖了智慧城市、智慧农业、智能工厂和智慧园区等多个领域，公司软硬件产品和解决方案获得华为技术认证，得到中国移动OCP认证，公司还是边缘计算产业联盟ECC成员。 感知物联，畅快无限。 联系我们 网站：http://yiqisoft.cn 邮件：support@yiqisoft.cn 电话：021-68863086 手机：186-1666-9123
引用文字 准备工作 OAuth2 认证基本知识； Odoo 14版本，单机部署，最好不使用 docker 环境； Odoo OAuth for Keycloak 扩展； Keycloak，配置好 Client 和 User； 工作原理 1. Odoo 插件安装 下载插件，https://github.com/OCA/server-auth/tree/14.0/auth_oidc，配置到 Odoo 外部扩展插件中，安装，具体步骤看插件 Readme 文件即可； 2. 配置 Odoo 支持 Keycloak 认证，按照下图例子参考配置 Odoo 即可； 3. Keycloak 配置，以便支持 Odoo； Clients 配置基本功能即可，可参考：https://yiqisoft.cn/blogs/iot_platform/243.html，尤其需要配置一个 Mapper，匹配 email 地址用： 创建 Keycloak 内置用户即可； 4. Odoo 用户配置 已知内置用户可以配置成 OAuth2 用户，这样内置用户可以登录 Odoo，OAuth2 用户也可以登录； 内置用户可以不创建，第一次登录 OAuth2 服务器后会自动创建，此时新创建用户无法使用 Odoo 登录，需要发送认证email后创建密码； 成果演示
设计 jrxml 文件 使用 Jaspersoft Studio 图形化设计报表，或使用文本文件 集成 JasperReports 和 JasperReports Font Extension pom.xml 中新增 net.sf.jasperreports jasperreports 6.15.0 net.sf.jasperreports jasperreports-fonts 6.15.0 PDF 中文支持 文件列表 jasperreports_extension.properties src/main/resources 下新建文件 net.sf.jasperreports.awt.ignore.missing.font=true net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory net.sf.jasperreports.extension.simple.font.families.dejavu=fonts/fonts.xml fonts.xml src/main/resources/fonts 目录下新建 <?xml version="1.0" encoding="UTF-8"?> fonts/simsun.ttf Identity-H <exportFonts/> simsun.ttf 从Windows电脑拷贝文件到 src/main/resources/fonts 下