250830-Mongodb清理磁盘空间碎片-db-runCommand-compact

问题描述

私服客户业务量的增加,录音数据不断增加,面临着磁盘空间不足的情况,因为 MongoDB 的特性,直接删除数据占用的磁盘空间并不会释放,即使
drop collection 也不行,除非 drop database。

如果一个 db 曾经有大量的数据一段时间后又删除的话,硬盘空间就是一个问题,如何收回被 mongodb 占用的多余空间?

磁盘空间越来越大,为了避免磁盘空间超过 95%以上导致锁库,清理方案迫在眉睫。

预估能整理的磁盘大小:

1
2
3
4
5
6
7
db
.call_audio
.chunks
.stats()
.wiredTiger["block-manager"]["file bytes available for reuse"]

>>1795354353454byte (B)换算为TB后为1.63287TB

解决方法选型

SUCC-执行离线修复mongod –repair(指定数据目录和目标数据库):

1
2
3
4
# 格式:mongod --repair --dbpath <数据存储目录> --repairDatabase <目标数据库名>
mongod --repair --dbpath /var/lib/mongodb --repairDatabase your_database_name

/var/lib/mongo

方法一:官方推荐 compact 整理(推荐指数 5 颗星)

img

操作步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
0.连接MongoDB 节点1.use '业务DB' 
//切换到业务库2.查看预估可以整理的磁盘碎片大小
db
.call_audio.chunks
.stats()
.wiredTiger["block-manager"]["file bytes available for reuse"]

>>17953543534543.进行碎片整理

db.runCommand({compact:"<collection_name>",force:true});

db.runCommand({compact:"device_data",force:true});

说明:(<collection_name>:集合名。
您可以通过show tables命令查询现有的集合。
force为可选项,如您需要在副本集实例的Primary节点执行该命令,需要设置force的值为true。)

4.等待执行,返回{ "ok" : 1 }
代表执行完成。
说明:(如果您执行的目标是一个大集合,而compact命令马上就返回{ "ok" : 1 }集合的物理空间也没有任何变化,则表示该集合没有必要进行碎片整理。

compact操作不会传递给Secondary节点,当实例为副本集实例时,请重复上述步骤通过MongoDB shell连接至Secondary节点,执行碎片整理命令。)
5.验证磁盘空间有没有变化

在MongoDB中,db.runCommand({compact:"collectionName",force:true})
用于压缩指定集合的数据文件,释放未使用的空间。
如果在执行该命令时出现超时问题,
可以尝试以下几种方法来处理:

1. 增加超时时间

MongoDB允许你设置命令的超时时间。
你可以通过maxTimeMS选项来设置命令的最大执行时间(以毫秒为单位)。
例如:

1
2
3
4
5
db.runCommand({
compact: "device_data",
force: true,
maxTimeMS: 3600000 // 设置超时时间为3600秒(1小时)
});

注意点:

1
2
3
4
5
当然以上是我们期望的多么完美的运行过程!!!
注意点:
1.执行前一定要停掉业务系统,确保没有读写操作,否则会导致锁住
2.大部分情况下磁盘慢场景下,都不满足磁盘整理的条件,所以操作后很快就返回了,如果删除了很多数据,并且还有不小于10%-20%剩余空间的话,还可以跑一下
3.不要气馁,还有其他方法释放空间

方法二:secondary 节点同步(推荐指数 5 颗星)

主要思想就是:在有新机器(磁盘)的情况下,新建一个 secondary 节点,使之与 primary 节点开始数据同步。数据的同步与直接复制数据文件不同,MongoDB
会只同步数据,因此同步完成后的数据文件是没有空集合的,以此实现了磁盘空间的回收。

上步骤:

img

注意点:

1
2
3
4
5
6
7
8
注意点:    
1.一定要做好数据的备份。
2.一定要注意主从配置优点:
1.同步的方法是比较好的,第一基本不会阻塞副本集的读写,
2.第二消耗的时间相对比较短,2T数据大概在74H内同步完成,且不影响正常使用。
3.second会清理掉大量的磁盘空间,达到我们的目的
4.索引会自动创建,不用再手动去创建缺点:
1.不用于复制包含分片集合的数据库

方法三:copyDatabase(推荐指数 3 颗星)

MongoDB 还支持在线复制数据:db.copyDatabase(“from”,”to”,”IP:port”),此种方法也能释放空间,因为 db.copyDatabase
复制的数据,而不是表示在磁盘中的数据文件。但是该方法在 4.0 版本起被弃用,3.x
版本还能继续使用,还可以复制远端数据库哦,方便多节点复制操作,但是需要我们备份好主库索引,手动创建索引。

主流程:

1
2
3
0.停掉所有业务数据读写操作1.db.copyDatabase("from","to","127.0.0.1:16161");复制出一个新的to数据库。这个已经是最小数据占用的数据。会在数据目录下产生to的相关数据文件。
2.将所有程序的配置从from库改为to库。测试无误。
3.这时可以删除from库。方法。use from 后 db.dropDatabase()。这个方法的好处是可以时间将磁盘上的数据删除掉,节省出很大的空间,但是需要手动创建索引。

上方法:

1
前提停掉所有服务0.Primary 对要迁移的db进行授权use 业务DB;db.createUser( { user: "rcrai", pwd: "xxxx", roles: [ "readWrite", "dbAdmin" ] } )db.grantRolesToUser('rcrai',[{ role: "dbAdmin", db: "业务DB" }]) 1.second机器上执行copy操作db.copyDatabase("源业务DB", "目标业务DB", "10.10.10.26:30017","rcrai","xxxx");2.等待执行完成,执行创建索引

注意点:

1
注意:second copy没执行完成和second索引没有手动创建完成前,一定不要启动业务读写,copy操作比较消耗IO,容易干挂docker的网络环境优点:    1.纯copy数据方式,速度快 2T数据耗时15小时完成    2.支持远程复制    3.second会清理掉大量的磁盘空间缺点:    1.不能自动创建索引    2.MongoDB4.0不支持,推荐方法三    3.不用于复制包含分片集合的数据库

方法四:mongodump And mongorestore(推荐指数 2 颗星)

原理简单粗暴,停服务,dump 出来数据,再 restore 回去。

上方法:

1
1.停业务服务,停止业务数据读写2.执行dump数据操作mongodump --host 10.10.12.25 --port 30017 -u rcrai -p eawmzaxtfnptvtpxefkd --authenticationDatabase admin --oplog -o /data/dumpmongo/3.执行restore恢复mongorestore --host 10.10.12.26 --port 30018 -u rcrai -p eawmzaxtfnptvtpxefkd --authenticationDatabase admin --oplogReplay /data/dumpmongo

注意点:

1
优点:    1.操作简单,步骤少    2.只适用于小量数据(小于200G的场景)缺点:    1.如果数据量比较大(大于200G),mongorestore执行时间较长(3T数据恢复大于100H)

方法五:db.repairDatabase()(推荐指数 1 颗星)

官网该命令的定义:清理无效或损坏的数据并重建数据库索引。类似于文件系统修复命令
fsck,所以此命令主要是用于修复数据。但是需要停机业务服务,即便你不停业务服务读写的话 MongoDB 自己也会锁住直到 repair
完成。注意要有足够的磁盘空间,需要额外一倍的空间,如果 MongoDB 占用了 500G,那么 repair 时还需要额外的 500G+2G 空间。

上方法:

1
use 业务DB;db.repairDatabase();

注意点:

1
注意:    1.db.repairDatabase()主要用于修复数据。若你拥有数据的完整副本,且有权限访问,请使用第二种方法“secondary节点同步”    2.在执行命令前请保证你有比较新的备份    3.此命令会完全阻塞数据库的读写,谨慎操作    4.此命令执行需要数据文件所在位置有等同于所有数据文件大小总和的空闲空间再加上2G    5.在使用MMAPv1存储引擎的secondary节点上执行该命令可以压缩集合数据    6.在使用WiredTiger存储引擎的MongoDB库上执行不会有压缩的效果    7.再碰到特殊情况要停止运行该命令时,可通过db.currentOp()查询进程信息,然后通过db.killOp()干掉进程优点:    1.可以追加磁盘,然后将目标目录指向新加的磁盘缺点:    1.非常消耗时间    2.在生产上操作如果意外停止可能会造成数据无法恢复的危险。    3.如果磁盘空间不足,小于现在这个db占用的空间,这种情况是用不了

总结

最终我们采用的是第二种和第三种方法去做的磁盘清理方案,操作客户的数据最终还是要从时效性,稳定性,以及失败的可恢复性去考虑。大家一定要注意:1.客户数据基本都在
T
级别以上,操作大规模数据属于高危操作,每一步都要慎重,且每一个环节和步骤都要在测试环节做大数据量的测试操作。2.一定要有至少一份的备份数据,且一段时间(一周)内不能被清除。3.方案不止要准备一种,私服环境多样,根据实际情况选择合适的方案。

【注】通过对官网的文档查阅不难发现,

MongoDB删除集合数据,物理磁盘空间不会直接释放,即使drop collections也无济于事。
除非drop databases。
在MongoDB4.0及以下,官网提供了一种回收MongoDB磁盘空间的方法,即 db.repairDatabase(),但该操作有一定的风险性。
注意MongoDB4.0以上版本 db.repairDatabase()方法已经被废弃。

【注】4.2 修复数据库repairDatabase()

db.repairDatabase()操作需要停业务进行,因为MongoDB会锁库直到 repair 操作完成。
另外,必须注意预留足够的磁盘空间,需要额外一倍的空间,如果MongoDB 占用数据磁盘了100G,那么 repair 时还需要额外的100G+2G 空间。
也可以追加磁盘,然后将目标目录指向新加的磁盘。

【注】.选择压缩率更高的算法

MongoDB 默认的建表方式采用 snappy 压缩算法。如果有需要,可以采用压缩率更高的 zlib 和 zstd 算法。
我曾经在某些业务中使用 zlib 算法,相比 snappy 能再节省 50% 的存储空间,仅供参考。

1
db.runCommand({create:<collection name>, storageEngine: {wiredTiger: {configString: "block_compressor=zlib"}}})

【注】.避免索引占用太多空间

可以在 mongo shell 终端执行 db.collection.stats() 查看索引大小。如果索引大小过大,需要进行优化:

通过 indexStats
命令查看索引使用情况,对于不会使用的索引,可以考虑删除。
参考:https://www.mongodb.com/docs/v6.0/reference/operator/aggregation/indexStats/
索引包含的字段应该尽量精简;
对于大 value 字段,可以在业务允许的场景下考虑使用 Hash 索引。参考下面的测试,可以将索引的大小降低 1 个数量级;

1
2
3
4
5
使用 YCSB 插入约 260 万条数据,对其中一个字段建索引,该字段为 100B 大小的BinData.
发现 Hash 索引比普通索引的存储空间降低了一个数量级:
Hash 索引 49MB VS 普通索引 310MB.
"field0_1" : 310861824,
"field0_hashed" : 49340416

250830-Mongodb清理磁盘空间碎片(repairDatabase&&Compact)

mongodb collection 如何能实现自动清理磁盘空间

MongoDB本身没有提供直接的自动清理磁盘空间的功能,但可以通过以下几种方法来实现磁盘空间的清理

1. 使用compact命令

compact命令可以对集合进行碎片整理,回收空闲的物理空间。执行该命令后,MongoDB会重新组织集合的数据文件,释放未使用的空间。例如:

1
db.runCommand({compact: "collectionName"});

**1. 增加超时时间 **

MongoDB允许你设置命令的超时时间。
你可以通过maxTimeMS选项来设置命令的最大执行时间(以毫秒为单位)。
例如:

1
2
3
4
5
db.runCommand({
compact: "device_data",
force: true,
maxTimeMS: 3600000 // 设置超时时间为3600秒(1小时)
});

2. 使用repairDatabase命令

repairDatabase命令可以修复数据库并回收磁盘空间。该命令会扫描数据库中的所有集合,删除无效的数据文件,并重新组织数据。执行方法如下:

1
db.repairDatabase();
1
db.runCommand({repairDatabase: 1});

此方法虽然有效,但可能会对数据库性能产生较大影响,且在执行过程中会锁定数据库

3. 基于时间的自动清理

如果需要定期清理旧数据以释放磁盘空间,可以使用MongoDB的TTL(Time To Live)索引。例如,为某个集合的日期字段创建TTL索引,设置过期时间为7天:

JavaScript

复制

1
db.collection.createIndex({createdAt: 1}, {expireAfterSeconds: 604800});

这样,MongoDB会自动删除createdAt字段值早于7天的文档。

250827-ubuntu20.04-跳过磁盘检查-硬盘启动禁用检查-Ubuntu initramfs 文件错误

在 Ubuntu 系统中,磁盘检查(fsck)通常在启动时自动运行,以确保文件系统的完整性。如果你希望取消或调整磁盘检查的行为,可以通过以下几种方法来实现:

1. 修改 /etc/fstab 文件

/etc/fstab 文件定义了文件系统的挂载选项,包括是否在启动时进行磁盘检查。你可以通过修改这个文件来取消磁盘检查。

  1. 打开 /etc/fstab 文件

    1
    sudo nano /etc/fstab
  2. 找到需要修改的文件系统条目: 每一行代表一个文件系统条目,通常包含以下字段:

    1
    <file system> <mount point>   <type>  <options>       <dump>  <pass>

其中 `` 字段(第六个字段)定义了启动时是否进行磁盘检查:

  • 0:不进行磁盘检查。
  • 1:在启动时进行磁盘检查(通常用于根文件系统)。
  • 2:在启动时进行磁盘检查(通常用于其他文件系统)。
  1. **将 字段设置为 `0`**: 将需要取消磁盘检查的文件系统条目的 字段设置为 0。例如:

    1
    UUID=your-uuid /               ext4    errors=remount-ro 0       0
  2. 保存并退出: 保存文件并退出编辑器。

![1756387237402](250827-etc-fstab-ubuntu20-04-跳过磁盘检查-硬盘启动禁用检查-Ubuntu initramfs 文件错误.assets/1756387237402.png)

250827-视频流播放Video-使用 FFmpeg 将视频转码为 H.264 编码格式

使用 FFmpeg 将视频转码为 H.264 编码格式

1
2
3
4
sudo apt-get -y install chromium-codecs-ffmpeg
sudo apt install -y ffmpeg

ffmpeg -i 1.mp4 -vcodec h264 output.mp4

ffmpeg 命令,压缩的参数可以设置

1
2
3
4
5
6
7
8
9
10
11
压缩参数示例
ffmpeg -i 1.mp4 -vcodec h264 -preset veryslow -crf 24 -b:v 500k -acodec aac -b:a 128k -r 15 output1.mp4

这个命令会:

- 使用 H.264 编码器。
- 设置编码预设为 `veryslow` 以获得更好的压缩效果。
- 设置恒定质量因子为 24。
- 设置视频比特率为 500 kbps。
- 使用 AAC 编码音频,音频比特率为 128 kbps。
- 设置帧率为 15 fps。

当然有!在使用 FFmpeg 转码视频时,可以通过设置一些参数来控制视频的压缩程度,从而减小文件大小。以下是一些常用的压缩参数:

1. 控制比特率(-b:v

比特率是控制视频质量的重要参数。较低的比特率会导致文件更小,但可能会牺牲一些质量。

1
ffmpeg -i 1.mp4 -vcodec h264 -b:v 500k output.mp4
  • -b:v:设置视频的比特率。
  • 500k:表示比特率为 500 kbps。

2. 使用两遍编码(-preset-crf

两遍编码可以更好地优化视频质量,同时减小文件大小。

1
ffmpeg -i 1.mp4 -vcodec h264 -preset veryslow -crf 24 output.mp4
  • -preset:设置编码速度和压缩效率。选项包括 ultrafastsuperfastveryfastfasterfastmedium(默认)、slow
    slowerveryslowveryslow 提供最佳压缩效果,但编码速度最慢。
  • -crf:设置恒定质量因子。范围是 0 到 51,其中 0 是无损,23 是默认值,51 是最差质量。通常推荐的范围是 18 到 28,18 是视觉上无损的,28
    是最低质量。

3. 控制音频比特率(-b:a

音频比特率也会影响文件大小。

1
ffmpeg -i 1.mp4 -vcodec h264 -b:v 500k -acodec aac -b:a 128k output.mp4
  • -acodec aac:指定音频编码器为 AAC。
  • -b:a 128k:设置音频比特率为 128 kbps。

4. 调整分辨率(-s-vf scale

降低视频分辨率可以显著减小文件大小。

1
ffmpeg -i 1.mp4 -vcodec h264 -s 640x360 output.mp4

或者使用更灵活的 scale 滤镜:

1
ffmpeg -i 1.mp4 -vcodec h264 -vf scale=640:360 output.mp4
  • -s 640x360:设置视频分辨率为 640x360。
  • -vf scale=640:360:使用 scale 滤镜调整视频分辨率。

5. 帧率(-r

降低帧率也可以减小文件大小。

1
ffmpeg -i 1.mp4 -vcodec h264 -r 15 output.mp4
  • -r 15:设置帧率为 15 fps。

6. 去除音频(-an

如果不需要音频,可以去除音频轨道,进一步减小文件大小。

1
ffmpeg -i 1.mp4 -vcodec h264 -an output.mp4
  • -an:去除音频。

综合示例

以下是一个综合示例,使用了多种参数来压缩视频:

1
ffmpeg -i 1.mp4 -vcodec h264 -preset veryslow -crf 24 -b:v 500k -acodec aac -b:a 128k -vf scale=640:360 -r 15 output1.mp4

这个命令会:

  • 使用 H.264 编码器。
  • 设置编码预设为 veryslow 以获得更好的压缩效果。
  • 设置恒定质量因子为 24。
  • 设置视频比特率为 500 kbps。
  • 使用 AAC 编码音频,音频比特率为 128 kbps。
  • 将视频分辨率调整为 640x360。
  • 设置帧率为 15 fps。

通过调整这些参数,你可以根据需要平衡视频质量和文件大小。

250823-(Permission denied)SELinux和AppArmor是Linux系统中的安全模块,它们可以限制文件的执行权限,即使你以root用户身份运行

SELinux和AppArmor是Linux系统中的安全模块,它们可以限制文件的执行权限,即使你以root用户身份运行

1
setenforce 0 # 临时解决

以下是一些解决SELinux或AppArmor限制root用户执行权限的方法:

SELinux

  • 临时关闭SELinux:可以使用setenforce 0
    命令临时将SELinux设置为宽容模式(Permissive),这样可以测试是否是SELinux导致的权限问题。如果关闭SELinux后问题解决,说明是SELinux策略限制了执行。
  • 查看SELinux状态:使用命令查看SELinux的当前状态。
  • 调整SELinux策略:如果需要长期解决,可以修改SELinux策略,允许特定文件或服务的执行。这需要一定的SELinux知识,可以通过工具来生成允许执行的策略。

AppArmor

  • 查看AppArmor状态:使用命令查看AppArmor是否启用。
  • 禁用AppArmor限制:对于AppArmor,可以使用aa-disable /path/to/your/script命令禁用对特定文件的限制。
  • 调整AppArmor配置:如果需要更细致的控制,可以编辑AppArmor的配置文件,位于目录下。根据需要修改配置文件,然后使用命令重新加载配置。

注意事项

  • 安全性:禁用SELinux或AppArmor会降低系统的安全性,因此只应在确定需要时进行,并且了解其潜在风险。
  • 长期解决方案:如果临时关闭SELinux或AppArmor后问题解决,建议不要长期保持关闭状态,而是应该修改相应的安全策略,以允许合法的执行,同时保持系统的安全性。

通过上述方法,你可以解决SELinux或AppArmor限制root用户执行权限的问题。如果问题仍然存在,可能需要进一步检查系统的其他配置或日志文件以获取更多信息。

yum-localinstall-使用 yum 的 localinstall 选项-本地安装rpm

使用 yumlocalinstall 选项

如果你不想手动列出所有依赖项,可以使用 yumlocalinstall 选项,它会自动解析并安装所需的依赖项:

1
yum localinstall -y wgcloud-client-1.0.0-1.x86_64.rpm

这个命令会自动下载并安装所有缺失的依赖项,然后安装 wgcloud-client

yum localinstall -y wgcloud-client-1.0.0-1.x86_64.rpm

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
yum localinstall -y wgcloud-client-1.0.0-1.x86_64.rpm
Last metadata expiration check: 0:25:58 ago on Wed Aug 20 15:13:53 2025.
Dependencies resolved.
=================================================================================================================================================
Package Architecture Version Repository Size
=================================================================================================================================================
Installing:
wgcloud-client x86_64 1.0.0-1 @commandline 164 M
Installing dependencies:
alsa-lib x86_64 1.2.13-2.el9 appstream 506 k
cairo x86_64 1.17.4-7.el9 appstream 659 k
cairo-gobject x86_64 1.17.4-7.el9 appstream 18 k
dejavu-sans-fonts noarch 2.37-18.el9 baseos 1.3 M
fontconfig x86_64 2.14.0-2.el9_1 appstream 274 k
fonts-filesystem noarch 1:2.0.5-7.el9.1 baseos 9.0 k
fribidi x86_64 1.0.10-6.el9.2 appstream 84 k
gdk-pixbuf2 x86_64 2.42.6-6.el9_6 appstream 465 k
langpacks-core-font-en noarch 3.0-16.el9 appstream 9.5 k
libX11 x86_64 1.7.0-11.el9 appstream 645 k
libX11-common noarch 1.7.0-11.el9 appstream 151 k
libX11-xcb x86_64 1.7.0-11.el9 appstream 10 k
libXau x86_64 1.0.9-8.el9 appstream 30 k
libXext x86_64 1.3.4-8.el9 appstream 39 k
libXfixes x86_64 5.0.3-16.el9 appstream 19 k
libXft x86_64 2.3.3-8.el9 appstream 61 k
libXi x86_64 1.7.10-8.el9 appstream 39 k
libXrender x86_64 0.9.10-16.el9 appstream 27 k
libXtst x86_64 1.2.3-16.el9 appstream 20 k
libXxf86vm x86_64 1.1.4-18.el9 appstream 18 k
libdatrie x86_64 0.2.13-4.el9 appstream 32 k
libglvnd x86_64 1:1.3.4-1.el9 appstream 133 k
libglvnd-glx x86_64 1:1.3.4-1.el9 appstream 140 k
libjpeg-turbo x86_64 2.0.90-7.el9 appstream 174 k
libthai x86_64 0.1.28-8.el9 appstream 208 k
libwayland-server x86_64 1.21.0-1.el9 appstream 41 k
libxcb x86_64 1.13.1-9.el9 appstream 224 k
libxshmfence x86_64 1.3-10.el9 appstream 12 k
llvm-libs x86_64 19.1.7-1.el9 appstream 57 M
mesa-dri-drivers x86_64 24.2.8-2.el9_6 appstream 9.4 M
mesa-filesystem x86_64 24.2.8-2.el9_6 appstream 11 k
mesa-libGL x86_64 24.2.8-2.el9_6 appstream 169 k
mesa-libgbm x86_64 24.2.8-2.el9_6 appstream 36 k
mesa-libglapi x86_64 24.2.8-2.el9_6 appstream 44 k
pango x86_64 1.48.7-3.el9 appstream 297 k
pixman x86_64 0.40.0-6.el9_3 appstream 269 k
xml-common noarch 0.6.3-58.el9 appstream 31 k

Transaction Summary
=================================================================================================================================================
Install 38 Packages

Total size: 236 M
Total download size: 57 M
Installed size: 607 M
Downloading Packages:
[SKIPPED] dejavu-sans-fonts-2.37-18.el9.noarch.rpm: Already downloaded
[SKIPPED] fonts-filesystem-2.0.5-7.el9.1.noarch.rpm: Already downloaded
[SKIPPED] libXxf86vm-1.1.4-18.el9.x86_64.rpm: Already downloaded
[SKIPPED] libthai-0.1.28-8.el9.x86_64.rpm: Already downloaded
[SKIPPED] libglvnd-1.3.4-1.el9.x86_64.rpm: Already downloaded
[SKIPPED] libXrender-0.9.10-16.el9.x86_64.rpm: Already downloaded
[SKIPPED] libX11-common-1.7.0-11.el9.noarch.rpm: Already downloaded
[SKIPPED] libXau-1.0.9-8.el9.x86_64.rpm: Already downloaded
[SKIPPED] mesa-libGL-24.2.8-2.el9_6.x86_64.rpm: Already downloaded
[SKIPPED] mesa-libglapi-24.2.8-2.el9_6.x86_64.rpm: Already downloaded
[SKIPPED] cairo-gobject-1.17.4-7.el9.x86_64.rpm: Already downloaded
[SKIPPED] gdk-pixbuf2-2.42.6-6.el9_6.x86_64.rpm: Already downloaded
[SKIPPED] libXext-1.3.4-8.el9.x86_64.rpm: Already downloaded
[SKIPPED] xml-common-0.6.3-58.el9.noarch.rpm: Already downloaded
[SKIPPED] libxshmfence-1.3-10.el9.x86_64.rpm: Already downloaded
[SKIPPED] langpacks-core-font-en-3.0-16.el9.noarch.rpm: Already downloaded
[SKIPPED] libX11-xcb-1.7.0-11.el9.x86_64.rpm: Already downloaded
[SKIPPED] mesa-libgbm-24.2.8-2.el9_6.x86_64.rpm: Already downloaded
[SKIPPED] libglvnd-glx-1.3.4-1.el9.x86_64.rpm: Already downloaded
[SKIPPED] libxcb-1.13.1-9.el9.x86_64.rpm: Already downloaded
[SKIPPED] libXft-2.3.3-8.el9.x86_64.rpm: Already downloaded
[SKIPPED] libdatrie-0.2.13-4.el9.x86_64.rpm: Already downloaded
[SKIPPED] libXtst-1.2.3-16.el9.x86_64.rpm: Already downloaded
[SKIPPED] alsa-lib-1.2.13-2.el9.x86_64.rpm: Already downloaded
[SKIPPED] pango-1.48.7-3.el9.x86_64.rpm: Already downloaded
[SKIPPED] cairo-1.17.4-7.el9.x86_64.rpm: Already downloaded
[SKIPPED] libXfixes-5.0.3-16.el9.x86_64.rpm: Already downloaded
[SKIPPED] fontconfig-2.14.0-2.el9_1.x86_64.rpm: Already downloaded
[SKIPPED] mesa-filesystem-24.2.8-2.el9_6.x86_64.rpm: Already downloaded
[SKIPPED] fribidi-1.0.10-6.el9.2.x86_64.rpm: Already downloaded
[SKIPPED] libwayland-server-1.21.0-1.el9.x86_64.rpm: Already downloaded
[SKIPPED] mesa-dri-drivers-24.2.8-2.el9_6.x86_64.rpm: Already downloaded
[SKIPPED] pixman-0.40.0-6.el9_3.x86_64.rpm: Already downloaded
[SKIPPED] libXi-1.7.10-8.el9.x86_64.rpm: Already downloaded
[SKIPPED] libjpeg-turbo-2.0.90-7.el9.x86_64.rpm: Already downloaded
[SKIPPED] libX11-1.7.0-11.el9.x86_64.rpm: Already downloaded
(37/37): llvm-libs-19.1.7-1.el9.x86_64.rpm 3.8 MB/s | 57 MB 00:15
-------------------------------------------------------------------------------------------------------------------------------------------------
Total 3.6 MB/s | 57 MB 00:15
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : pixman-0.40.0-6.el9_3.x86_64 1/38
Installing : libjpeg-turbo-2.0.90-7.el9.x86_64 2/38
Installing : fribidi-1.0.10-6.el9.2.x86_64 3/38
Installing : libdatrie-0.2.13-4.el9.x86_64 4/38
Installing : libthai-0.1.28-8.el9.x86_64 5/38
Installing : libX11-xcb-1.7.0-11.el9.x86_64 6/38
Installing : libxshmfence-1.3-10.el9.x86_64 7/38
Installing : libXau-1.0.9-8.el9.x86_64 8/38
Installing : libxcb-1.13.1-9.el9.x86_64 9/38
Installing : libglvnd-1:1.3.4-1.el9.x86_64 10/38
Installing : fonts-filesystem-1:2.0.5-7.el9.1.noarch 11/38
Installing : dejavu-sans-fonts-2.37-18.el9.noarch 12/38
Installing : langpacks-core-font-en-3.0-16.el9.noarch 13/38
Installing : gdk-pixbuf2-2.42.6-6.el9_6.x86_64 14/38
Installing : libwayland-server-1.21.0-1.el9.x86_64 15/38
Installing : mesa-filesystem-24.2.8-2.el9_6.x86_64 16/38
Installing : alsa-lib-1.2.13-2.el9.x86_64 17/38
Installing : llvm-libs-19.1.7-1.el9.x86_64 18/38
Installing : mesa-libglapi-24.2.8-2.el9_6.x86_64 19/38
Installing : mesa-libgbm-24.2.8-2.el9_6.x86_64 20/38
Installing : mesa-dri-drivers-24.2.8-2.el9_6.x86_64 21/38
Running scriptlet: xml-common-0.6.3-58.el9.noarch 22/38
Installing : xml-common-0.6.3-58.el9.noarch 22/38
Installing : fontconfig-2.14.0-2.el9_1.x86_64 23/38
Running scriptlet: fontconfig-2.14.0-2.el9_1.x86_64 23/38
Installing : libX11-common-1.7.0-11.el9.noarch 24/38
Installing : libX11-1.7.0-11.el9.x86_64 25/38
Installing : libXext-1.3.4-8.el9.x86_64 26/38
Installing : libXrender-0.9.10-16.el9.x86_64 27/38
Installing : cairo-1.17.4-7.el9.x86_64 28/38
Installing : libXxf86vm-1.1.4-18.el9.x86_64 29/38
Installing : libXi-1.7.10-8.el9.x86_64 30/38
Installing : libXtst-1.2.3-16.el9.x86_64 31/38
Installing : cairo-gobject-1.17.4-7.el9.x86_64 32/38
Installing : libXft-2.3.3-8.el9.x86_64 33/38
Installing : pango-1.48.7-3.el9.x86_64 34/38
Installing : libXfixes-5.0.3-16.el9.x86_64 35/38
Installing : libglvnd-glx-1:1.3.4-1.el9.x86_64 36/38
Installing : mesa-libGL-24.2.8-2.el9_6.x86_64 37/38
Running scriptlet: wgcloud-client-1.0.0-1.x86_64 38/38
Installing : wgcloud-client-1.0.0-1.x86_64 38/38
Running scriptlet: wgcloud-client-1.0.0-1.x86_64 38/38
Created symlink /etc/systemd/system/wgcloud-client-os.service → /lib/systemd/system/wgcloud-client-os.service.
Created symlink /etc/systemd/system/multi-user.target.wants/wgcloud-client-os.service → /lib/systemd/system/wgcloud-client-os.service.

Running scriptlet: fontconfig-2.14.0-2.el9_1.x86_64 38/38
Running scriptlet: wgcloud-client-1.0.0-1.x86_64 38/38
Verifying : dejavu-sans-fonts-2.37-18.el9.noarch 1/38
Verifying : fonts-filesystem-1:2.0.5-7.el9.1.noarch 2/38
Verifying : libXxf86vm-1.1.4-18.el9.x86_64 3/38
Verifying : libthai-0.1.28-8.el9.x86_64 4/38
Verifying : libglvnd-1:1.3.4-1.el9.x86_64 5/38
Verifying : libXrender-0.9.10-16.el9.x86_64 6/38
Verifying : libX11-common-1.7.0-11.el9.noarch 7/38
Verifying : libXau-1.0.9-8.el9.x86_64 8/38
Verifying : mesa-libGL-24.2.8-2.el9_6.x86_64 9/38
Verifying : mesa-libglapi-24.2.8-2.el9_6.x86_64 10/38
Verifying : cairo-gobject-1.17.4-7.el9.x86_64 11/38
Verifying : gdk-pixbuf2-2.42.6-6.el9_6.x86_64 12/38
Verifying : libXext-1.3.4-8.el9.x86_64 13/38
Verifying : xml-common-0.6.3-58.el9.noarch 14/38
Verifying : libxshmfence-1.3-10.el9.x86_64 15/38
Verifying : langpacks-core-font-en-3.0-16.el9.noarch 16/38
Verifying : libX11-xcb-1.7.0-11.el9.x86_64 17/38
Verifying : mesa-libgbm-24.2.8-2.el9_6.x86_64 18/38
Verifying : libglvnd-glx-1:1.3.4-1.el9.x86_64 19/38
Verifying : llvm-libs-19.1.7-1.el9.x86_64 20/38
Verifying : libxcb-1.13.1-9.el9.x86_64 21/38
Verifying : libXft-2.3.3-8.el9.x86_64 22/38
Verifying : libdatrie-0.2.13-4.el9.x86_64 23/38
Verifying : libXtst-1.2.3-16.el9.x86_64 24/38
Verifying : alsa-lib-1.2.13-2.el9.x86_64 25/38
Verifying : pango-1.48.7-3.el9.x86_64 26/38
Verifying : cairo-1.17.4-7.el9.x86_64 27/38
Verifying : libXfixes-5.0.3-16.el9.x86_64 28/38
Verifying : fontconfig-2.14.0-2.el9_1.x86_64 29/38
Verifying : mesa-filesystem-24.2.8-2.el9_6.x86_64 30/38
Verifying : fribidi-1.0.10-6.el9.2.x86_64 31/38
Verifying : libwayland-server-1.21.0-1.el9.x86_64 32/38
Verifying : mesa-dri-drivers-24.2.8-2.el9_6.x86_64 33/38
Verifying : pixman-0.40.0-6.el9_3.x86_64 34/38
Verifying : libXi-1.7.10-8.el9.x86_64 35/38
Verifying : libjpeg-turbo-2.0.90-7.el9.x86_64 36/38
Verifying : libX11-1.7.0-11.el9.x86_64 37/38
Verifying : wgcloud-client-1.0.0-1.x86_64 38/38

Installed:
alsa-lib-1.2.13-2.el9.x86_64 cairo-1.17.4-7.el9.x86_64 cairo-gobject-1.17.4-7.el9.x86_64
dejavu-sans-fonts-2.37-18.el9.noarch fontconfig-2.14.0-2.el9_1.x86_64 fonts-filesystem-1:2.0.5-7.el9.1.noarch
fribidi-1.0.10-6.el9.2.x86_64 gdk-pixbuf2-2.42.6-6.el9_6.x86_64 langpacks-core-font-en-3.0-16.el9.noarch
libX11-1.7.0-11.el9.x86_64 libX11-common-1.7.0-11.el9.noarch libX11-xcb-1.7.0-11.el9.x86_64
libXau-1.0.9-8.el9.x86_64 libXext-1.3.4-8.el9.x86_64 libXfixes-5.0.3-16.el9.x86_64
libXft-2.3.3-8.el9.x86_64 libXi-1.7.10-8.el9.x86_64 libXrender-0.9.10-16.el9.x86_64
libXtst-1.2.3-16.el9.x86_64 libXxf86vm-1.1.4-18.el9.x86_64 libdatrie-0.2.13-4.el9.x86_64
libglvnd-1:1.3.4-1.el9.x86_64 libglvnd-glx-1:1.3.4-1.el9.x86_64 libjpeg-turbo-2.0.90-7.el9.x86_64
libthai-0.1.28-8.el9.x86_64 libwayland-server-1.21.0-1.el9.x86_64 libxcb-1.13.1-9.el9.x86_64
libxshmfence-1.3-10.el9.x86_64 llvm-libs-19.1.7-1.el9.x86_64 mesa-dri-drivers-24.2.8-2.el9_6.x86_64
mesa-filesystem-24.2.8-2.el9_6.x86_64 mesa-libGL-24.2.8-2.el9_6.x86_64 mesa-libgbm-24.2.8-2.el9_6.x86_64
mesa-libglapi-24.2.8-2.el9_6.x86_64 pango-1.48.7-3.el9.x86_64 pixman-0.40.0-6.el9_3.x86_64
wgcloud-client-1.0.0-1.x86_64 xml-common-0.6.3-58.el9.noarch

Complete!

250808-MongoDBHA-MongoDB副本集rs.initiate() 三个副本集节点都执行了,怎么办

你现在的情况是:三台机器上都执行了 rs.initiate(),这会导致每台机器都独立地成为了自己的单节点副本集
(各自成为一个不同的副本集),它们彼此之间并不知道对方的存在,所以整个副本集无法形成。


🔥 问题本质

MongoDB 的副本集只能由一个节点执行一次 rs.initiate() 来初始化整个副本集。
你在三台机器上都执行了,相当于创建了三个互不相关的副本集,这是错误的操作。


✅ 正确做法(修复步骤)

✅ 步骤 1:停止所有节点上的 MongoDB 服务

清理数据目录(dbpath)

bash

复制

1
2
3
4
# 每台机器上执行
sudo systemctl stop mongod
# 或
mongod --shutdown --dbpath /data/db

✅ 步骤 2:清理副本集配置(每台机器都要做

MongoDB 会把副本集配置保存在 local.replset 集合中,你需要清理掉这些配置。

bash

复制

1
2
3
4
5
6
7
8
9
10
# 进入 MongoDB shell(单节点启动,不指定 replSet)
mongod --dbpath /data/db --port 27017 --fork --logpath /var/log/mongod.log

mongo --port 27017

# 删除副本集配置
use local
db.dropDatabase() # 会清空 local 库,包括副本集配置和 oplog

exit

⚠️ 注意:这个操作会清除副本集配置和 oplog,不会影响你的业务数据(除非你业务数据也放在 local 库)。


✅ 步骤 3:重新以副本集模式启动 MongoDB(所有节点)

bash

复制

1
mongod --replSet rs0 --bind_ip 0.0.0.0 --dbpath /data/db --port 27017 --fork --logpath /var/log/mongod.log

✅ 步骤 4:只在一个节点(主节点)上执行初始化

连接任意一台节点(建议选你希望的 PRIMARY),执行:

JavaScript

复制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
rs.initiate({
_id: "rs0",
members: [
{_id: 0, host: "192.168.0.245:27017"},
{_id: 1, host: "192.168.0.246:27017"},
{_id: 2, host: "192.168.0.247:27017", arbiterOnly: true}
]
})

rs.initiate({
_id: "replicaset",
members: [
{_id: 0, host: "192.168.0.245:27017"},
{_id: 1, host: "192.168.0.246:27017"},
{_id: 2, host: "192.168.0.247:27017", arbiterOnly: true}
]
})
字段 含义
_id: "replicaset" 创建或指定一个名为 replicaset 的副本集。
members 列出这个副本集里的所有成员(节点)。
_id: 0/1/2 每个成员在副本集内的唯一标识符
host 每个成员的 IP:端口,告诉副本集怎么找到它们。
  1. 当前你连接的这台节点(假设是 192.168.0.245)会成为 PRIMARY
  2. 它会尝试与 192.168.0.246、192.168.0.247 建立心跳连接。
  3. 如果这两台节点已经以 --replSet replicaset 启动且数据目录干净,它们会进入 SECONDARY 状态。
  4. 最终形成一个 三节点副本集(1 主 2 从)。

✅ 步骤 5:验证副本集状态

JavaScript

复制

1
2
rs.status()
rs.conf()

✅ 总结一句话

每台都执行 rs.initiate() 是错误的,必须清理配置后,只用一台机器初始化整个副本集。

如你不确定该删哪个目录、如何备份,我可以帮你写个脚本。

250805-Ubuntu20.04优化配置脚本-Ubuntu-Scripts

/etc/sudoers配置

1
ubuntu ALL=(ALL:ALL) NOPASSWD: ALL

Ubuntu 20.04 优化配置脚本

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#!/bin/sh

# 禁用内核更新
sudo apt-mark hold linux-generic linux-image-generic linux-headers-generic
# 锁定内核
sudo apt-mark hold linux-generic linux-image-generic linux-headers-generic
sudo apt-mark hold linux-image-generic linux-headers-generic

sudo apt update

# 禁用内核更新
sudo apt-mark hold linux-generic linux-image-generic linux-headers-generic
# 锁定内核
sudo apt-mark hold linux-generic linux-image-generic linux-headers-generic
sudo apt-mark hold linux-image-generic linux-headers-generic

sudo timedatectl set-timezone Asia/Shanghai
sudo cat /etc/timezone

# sudo mkdir -p /root/snap/chromium/common/chromium/BrowserMetrics

sudo apt install language-pack-zh-hans -y
sudo locale-gen zh_CN.UTF-8
sudo update-locale LANG=zh_CN.UTF-8

export LANG=zh_CN.UTF-8

sudo apt-get install vim -y && sudo apt-get remove nano -y
sudo apt install fonts-wqy-zenhei fonts-wqy-microhei fonts-noto-cjk -y
sudo apt install -y fontconfig
sudo apt install -y fonts-dejavu-core fonts-liberation

sudo apt install fonts-wqy-zenhei fonts-wqy-microhei fonts-noto-cjk -y
sudo apt install -y git
sudo apt install net-tools -y
sudo apt install openssh-server -y
sudo apt install -y fontconfig
sudo apt install -y fonts-dejavu-core fonts-liberation

# 禁用自动更新
sudo sed -i 's/APT::Periodic::Update-Package-Lists "1";/APT::Periodic::Update-Package-Lists "0";/g' /etc/apt/apt.conf.d/10periodic
sudo sed -i 's/APT::Periodic::Unattended-Upgrade "1";/APT::Periodic::Unattended-Upgrade "0";/g' /etc/apt/apt.conf.d/10periodic

# 禁用无人值守升级
sudo sed -i 's/APT::Periodic::Update-Package-Lists "1";/APT::Periodic::Update-Package-Lists "0";/g' /etc/apt/apt.conf.d/20auto-upgrades
sudo sed -i 's/APT::Periodic::Unattended-Upgrade "1";/APT::Periodic::Unattended-Upgrade "0";/g' /etc/apt/apt.conf.d/20auto-upgrades

# 禁用 apt-daily 服务和计时器
sudo systemctl stop apt-daily.service
sudo systemctl disable apt-daily.service
sudo systemctl mask apt-daily.service
sudo systemctl daemon-reload
sudo systemctl stop apt-daily.timer
sudo systemctl disable apt-daily.timer
sudo systemctl mask apt-daily.timer
sudo systemctl daemon-reload

# 禁用 unattended-upgrades 服务
sudo systemctl disable unattended-upgrades

# 禁用 Snap 自动更新
sudo snap refresh --hold

# 禁用自动更新
sudo systemctl stop apt-daily.service
sudo systemctl disable apt-daily.service
sudo systemctl kill --kill-who=main apt-daily.service
sudo systemctl disable apt-daily.timer
sudo systemctl mask apt-daily.timer
sudo systemctl stop unattended-upgrades.service
sudo systemctl disable unattended-upgrades.service

sudo systemctl daemon-reload

# Ubuntu自动登录和开机锁屏取消
## 禁用自动锁屏:
# gsettings set org.gnome.desktop.screensaver lock-enabled false
# gsettings set org.gnome.desktop.lockdown disable-lock-screen true

# 禁用内核更新
sudo apt-mark hold linux-generic linux-image-generic linux-headers-generic
# 恢复内核更新
sudo apt-mark unhold linux-generic linux-image-generic linux-headers-generic

sudo sed -i 's/1/0/' /etc/apt/apt.conf.d/10periodic
sudo sed -i 's/2/0/' /etc/apt/apt.conf.d/10periodic

sudo sed -i 's/1/0/' /etc/apt/apt.conf.d/20auto-upgrades
sudo sed -i 's/2/0/' /etc/apt/apt.conf.d/20auto-upgrades

sudo apt remove update-notifier -y

# 禁用屏幕休眠
# gsettings set org.gnome.desktop.session idle-delay 0

sudo mkdir -p /home/mes/.ssh

sudo touch /home/mes/.ssh/authorized_keys


# Linux优化-Ulimit
# 写入文件内容

sudo bash -c 'cat <<EOF > /etc/security/limits.conf
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
EOF'

# >> 表示 追加 到文件末尾,不会破坏原有内容
sudo bash -c 'cat <<EOF > /etc/systemd/system.conf
[Manager]
DefaultLimitNOFILE=1048576
EOF'

# >> 表示 追加 到文件末尾,不会破坏原有内容
sudo bash -c 'cat <<EOF > /etc/sysctl.conf
net.ipv4.ip_forward = 1
fs.file-max = 1048576
fs.inotify.max_user_instances=512
fs.inotify.max_user_watches=262144
EOF'

# 安装chrome谷歌浏览器
sudo apt update

# 谷歌浏览器取消登录密钥环**然后重启系统,首次打开 Chrome 时会提示创建新密钥环,直接留空密码并继续即可
rm -rf /home/ubuntu/.local/share/keyrings/*
sudo rm -rf /home/ubuntu/.local/share/keyrings/*

# 调整电视连接显示配置
sudo sed -i 's/#HandleLidSwitch=suspend/HandleLidSwitch=ignore/g' /etc/systemd/logind.conf

sudo apt autoremove -y

# 配置密钥允许
sudo bash -c 'cat <<EOF >> /home/ubuntu/.ssh/authorized_keys

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCiKRDip9YCWzsIe2a0bT2az8DjH7k6cBij8bpfcNaIqSfz+/PJWDPwK4VeC4Ko4E8jQYct8i9u9VKcAK9XUhMEQNlpmpC+KXHApMBJ8Stm8yHb65gOcl8sDxdyWB3LevzLhsK8ZvI1Fus7O5vwmGjdOxhhw/89aZG6xHM8gfe+IYjCdm+n6rMz0RTAgP/QVsLjrLqk8VxC/kb1QjKG0BjZsMnTvs32oiqgJ4Eif8TUpXnDin+lRL4v2fUjRMfOS7PSIMNUAtvtRd3lBp9u4Yk1VtRy+ZWITpXvnURlEp/bKiIxf2G2gUVsDZXLVu1l04FNB7bOEj99qolhfXYERJYSBMYSjPCrOmBTYuYlokqk/r4RtNncNXEs4WPipw/LekCEYs1rjBR7uUditEAJbCM4elUkN8t4XHZy9FKSRE/pdkhekW+dUf6AResMlTV/bCNYQu/JcUBvvWxscqsxYiZ5Q+lRJb1T6c0bTKSN3RddY3YMa1gdqWgK8O/OBVq2q80= Administrator@DESKTOP-12ALS0Q
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDERDBQtrr03DzuNYZhtIrWIVBWTOWrgptdVGMwQnGZqH5pLe88J0H5JtCUvXFZtah8JzsOcxrIHFNY52SYhKokfDBKdoFLEGQ6W0f5BOpVAdLSh1jMU/ybkn+8TGygy85qs8g1IEk7u8loqWNRT/mBOd6MZJTZQxivYIOBCzC1oeBlzO0fBqnlPoYxWahC2ifDbs5lc0DrNElJPeklVVLwGJNTc3wn0Y6tSFdb9975SLYBsp8XoDWI0wCsqp/afI3zH7Ms+CIxz6XzsjjIEXwnCRxKjbLOGJLeDOFlf+ArqrV5WBWBD39qFVmq9rTfvjG4o+cPSgz1zyN1LyPK3+CQVtk3+2Bb1lPHaw4NdyCakrnT3aTdYsICvmD88Gre/wDgXid5osqoGfRYOWtzHIULmWH4k6HGg4O9W9EHU1lm2qP/Zt8CHC+tPhSYwOovu//lyhg4ygMDLCkHnXy4cCfdxQ4HvgHPQpmHkCfNgIgWTotykIUZbCbJpowJPNngOFM= root@sop

EOF'

#
sudo apt autoremove -y
# sudo reboot
# sudo systemctl restart systemd-logind