260114-Ubuntu20.04-uname-ra指定内核升级OR降级linux-image-5.4.0-150-generic

1.显示系统全部内核

1
sudo dpkg --get-selections | grep linux

2.完全删除系统内核

1
2
sudo apt-get remove --purge linux-modules-5.4.0-42-generic
sudo apt-get remove --purge linux-modules-5.15.0-71-generic -y

ubuntu内核是5.4.0-150-generic

1
2
sudo apt update
sudo apt-cache search linux-image-5.4.0-150-generic

一次性安装老内核的 4 个包(缺少哪个后期再补)

1
2
3
4
5
sudo apt install -y \
linux-image-5.4.0-150-generic \
linux-headers-5.4.0-150-generic \
linux-modules-5.4.0-150-generic \
linux-modules-extra-5.4.0-150-generic

想禁止内核自动更新,可把已安装的老内核“hold”住:

1
sudo apt-mark hold linux-image-5.4.0-150-generic

Ubuntu18.04关闭内核自动更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
---------------------------------------------------------------------------------------
/boot/grub/grub.cfg
# 关闭内核自动更新
----------------------------------------------------------------------

# 修改以下文件

sudo vim /etc/apt/apt.conf.d/10periodic
sudo vim /etc/apt/apt.conf.d/20auto-upgrades

#关闭自动更新
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Download-Upgradeable-Packages "0";
APT::Periodic::AutocleanInterval "0";
APT::Periodic::Unattended-Upgrade "0";

#开启自动更新
APT::Periodic::Update-Package-Lists "2";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "0";
APT::Periodic::Unattended-Upgrade "1";
----------------------------------------------------------------------

指定内核版本(5.4.0-150-generic)

1
2
sudo apt-mark hold linux-headers-5.4.0-150-generic
sudo apt-mark hold linux-image-5.4.0-150-generic

Ubuntu删除多余内核

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#查看已安装的内核
sudo dpkg --get-selections | grep linux-image

linux-image-5.15.0-139-generic install
linux-image-5.15.0-67-generic deinstall
linux-image-5.4.0-150-generic hold
linux-image-unsigned-5.15.0-67-generic install

#找出系统已经安装的内核版本
sudo dpkg --get-selections|grep linux

#卸载不需要的内核
sudo apt-get remove 内核名称
sudo apt-get remove linux-image-5.15.0-139-generic
sudo apt purge linux-image-5.15.0-139-generic

sudo apt autoremove

#修改 /boot/grub/grub.cfg文件,删除启动项
sudo cat /boot/grub/grub.cfg

Ubuntu关闭自动更新

关闭自动更新

1
2
sudo apt-mark hold linux-image-5.4.0-150-generic
sudo apt-mark hold linux-image-5.11.0-27-generic

GRUB指定内核

选择内核启动

  1. 如果您的系统中有多个内核版本,您可以在启动时选择要启动的内核版本。查看当前系统中内核的启动顺序:
1
grep 'menuentry' /boot/grub/grub.cfg

找到您想要设置为默认启动的内核条目,然后修改 /etc/default/grub 文件中的 GRUB_DEFAULT
配置项,将其设置为对应的内核启动项。例如,如果您想要设置 Ubuntu, with Linux 5.4.0-150-generic 为默认启动项,您可以这样设置:

1
sudo sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.4.0-150-generic"/g' /etc/default/grub

然后再次更新 GRUB 并重启:

1
2
sudo update-grub
sudo reboot

查看内核

1
2
3
uname -ra

Linux jenkins171 5.15.0-139-generic #149~20.04.1-Ubuntu SMP Wed Apr 16 08:29:56 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux

1768381416444


要将系统内核切换到 5.4.0-150-generic,你需要做以下几步:

1
2
3
4
5
6
7
sudo dpkg --get-selections | grep linux-image
linux-image-5.15.0-139-generic install
linux-image-5.15.0-67-generic deinstall
linux-image-5.4.0-150-generic hold
linux-image-unsigned-5.15.0-67-generic deinstall

内核如何调整到linux-image-5.4.0-150-generic

你现在的系统中已经安装了 linux-image-5.4.0-150-generic,并且它的状态是 hold,这意味着它被“锁定”了,不会被自动更新或卸载。

要将系统内核切换到 5.4.0-150-generic,你需要做以下几步:


✅ 步骤 1:确认 GRUB 中已有该内核

先确认 GRUB 启动菜单中已经有 5.4.0-150-generic 的启动项:

1
grep -i "5.4.0-150" /boot/grub/grub.cfg

如果输出中有类似 linux-5.4.0-150-generic 的条目,说明 GRUB 已经识别到它。


✅ 步骤 2:临时切换(重启后手动选)

重启系统,在 GRUB 菜单中手动选择 Advanced options for Ubuntu,然后选择 5.4.0-150-generic 启动。


✅ 步骤 3:永久切换(设置默认启动内核)

如果你想永久使用 5.4.0-150-generic,可以设置 GRUB 默认启动项:

1. 查看 GRUB 菜单顺序:

1
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/grub/grub.cfg

找到 5.4.0-150-generic 对应的编号(比如是 2>4 这样的格式)。

2. 编辑 GRUB 默认配置:

1
sudo nano /etc/default/grub

找到这一行:

1
GRUB_DEFAULT=0

改为:

1
GRUB_DEFAULT="2>4"

(注意:这里的 2>4 是示例,你要根据你实际的编号替换)

3. 更新 GRUB 配置:

1
sudo update-grub

✅ 步骤 4:重启系统

1
sudo reboot

⚠️ 注意事项

  • hold 状态的内核不会被自动更新,这是好事,如果你需要它长期稳定。

  • 如果你之后想取消 hold,可以用:

1
sudo apt-mark unhold linux-image-5.4.0-150-generic

完成后你可以用 uname -r 确认当前正在运行的内核版本是否为 5.4.0-150-generic

260112-Linux-vmstat查看系统上下文切换是否正常

linux vmstat 1 如何查看线程上下文切换 是否正常 4核8GB的Ubuntu20.04系统

vmstat 1 输出中,cs 列 表示每秒上下文切换次数,结合 4 核 8GB Ubuntu 20.04 系统,判断方法如下:

1. 核心指标:cs 列数值

1
vmstat 1

输出示例:

plaintext

1
2
3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 329452 81560 583244 0 0 0 1 112 234 1 1 98 0 0
  • cs:每秒上下文切换次数

2. 正常范围参考

系统负载状态 正常 cs 值范围
轻负载(无高并发进程) 几百~几千
中负载(常规服务运行) 几千~几万
高负载(高并发 / 多线程程序) 几万~几十万(需结合其他指标)

4 核 8GB Ubuntu 20.04:无高并发服务时,cs 稳定在 1000 以内 属正常;运行 Web / 数据库等服务,cs 几万内且无性能卡顿也可接受。

3. 异常判断 & 排查

(1)异常信号

  • cs 数值 突然飙升(如从几千涨到几十万)
  • 伴随 %us(用户 CPU)/ %sy(内核 CPU)升高、r(等待运行进程数)持续大于核数

(2)排查工具

1
2
3
4
5
# 1. 查看进程上下文切换详情(cswch自愿,nvcswch非自愿)
pidstat -w 1

# 2. 查看线程级别上下文切换
pidstat -wt 1

4. 关键结论

cs 无绝对 “正常值”,核心看 是否稳定 + 是否伴随性能问题(卡顿、延迟高)。4 核 8GB 系统,无高并发时 cs
过高(如几十万)大概率异常,需排查多线程程序或系统瓶颈~

sudo vmstat 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b 交换 空闲 缓冲 缓存 si so bi bo in cs us sy id wa st
53 0 1280 172096 53668 2899092 0 0 0 0 4590 16048 91 6 3 0 0
70 0 1280 177264 53668 2899464 0 0 0 0 4925 14850 92 6 2 0 0
63 0 1280 187488 53668 2899124 0 0 0 0 4414 14884 90 7 2 0 0
70 0 1280 176072 53668 2900104 0 0 0 0 4490 15137 92 6 3 0 0
70 0 1280 179400 53676 2894888 0 0 0 28 4790 15637 89 8 4 0 0
46 0 1280 172116 53676 2895848 0 0 0 14940 4193 13649 91 6 2 0 0
70 0 1280 182940 53676 2896604 0 0 0 0 4455 14426 91 7 3 0 0
71 0 1280 177308 53676 2896372 0 0 0 0 5094 14102 92 7 1 0 0
74 0 1280 180472 53676 2896664 0 0 0 0 4543 13903 92 6 3 0 0
70 0 1280 182832 53684 2896832 0 0 0 52 4816 14569 89 8 3 0 0
70 0 1280 185948 53684 2896720 0 0 0 52 4701 13914 92 7 2 0 0
123 0 1280 176496 53684 2897016 0 0 0 0 4412 13588 91 8 2 0 0
70 0 1280 178112 53684 2897772 0 0 0 0 4518 13660 91 7 1 0 0

260106-WinCC 通信连接的状态变量

https://www.ad.siemens.com.cn/productportal/prods/hmi/wincc/q8_faq/wincc_connectionstates.html#biaoti02

WinCC 通信连接的状态变量

WinCC V7.5 通信连接状态变量

WinCC 从V7.5 版本之后,对于所有的通信连接,可以自动创建通信连接的状态变量,用于显示通信连接的状态或者控制通信的断/开。

在变量管理器中选择所要组态的通信连接,点击鼠标右键(①),在菜单中选择“创建启用/禁用变量”(②)。可以看到在内部变量“ConnectionStates”变量组下,相应连接的2个状态变量已经被创建(③)。变量名的格式为“@Connectionname@ConnectionStateEx”
和 “@Connectionname@ForceConnectionStateEx”,数据类型都是“无符号32位值”。

img

其中, “@Connectionname@ForceConnectionStateEx” 用来建立/断开通信连接,设置为1:建立连接,设置为0:断开连接。此变量默认初始值设置为1。

“@Connectionname@ConnectionStateEx” 用来反馈通信连接状态, 值为1时代表连接已经建立,值为0时代表连接已经断开。

WinCC V7.3 通信连接状态变量

WinCC V7.3及其之后的版本中的“SIMATIC S7-1200,S7-1500 Channel”通道支持通信连接状态变量,但组态步骤和WinCC
V7.5有所不同。具体组态方法如下:

需要在连接下手动创建变量 “@Connectionname@ForceConnectionState” 和 “@Connectionname@ConnectionState”。

img

这两个变量用法和WinCC V7.5相同, “@Connectionname@ForceConnectionState” 用来建立/断开通信连接,设置为1:建立连接,设置为0:断开连接。此变量默认初始值设置为1。
“@Connectionname@ConnectionState” 用来反馈通信连接状态, 值为1时代表连接已经建立,值为0时代表连接已经断开。

注意,这里的系统变量使用PLC中没有用到的地址,只是占用相应的PLC地址而不会实际改变PLC地址的值。例如,设置上图中的变量“@S71500@ForceConnectionState”为1,“S71500”连接会建立,但PLC中的MD204的值不会随着变为1。

260106-wincc采集数据-监控OMS-连接是否有效

一句话总结(ConnectionState)

WinCC 自带“@连接名@ConnectionState”系统变量,
0=离线 1=在线;
把它做在画面上或脚本里,就能第一时间知道设备是否掉线,
比盯着过程值可靠得多。

添加变量

确认状态 ConnectionStateEx

wincc oms+采集数据,采集通道连接如何触发重新连接

ConnectionEstablishMode

@ConnectionEstablishMode 并不是在 WinCC 的“变量管理”里手动建出来的普通变量,
而是通道在创建时自动生成的“系统变量”。
想找到它,只要打开:
WinCC 资源管理器 → 变量管理 →
展开你正在用的那条 S7 通道(如“OMS+”或“SIMATIC S7-1200/1500”)→
再展开下面的某个“连接”→
右侧窗口里就能看到名字以“@”开头的系统变量列表,
其中就有 @ConnectionEstablishMode(数据类型 DWORD,默认值 1)[29^]。
如果列表里没看到,把列宽拉大一点或把“系统变量”筛选打开即可。

在 WinCC 里,OMS+ 通道本身没有“一键重连”按钮,想让 S7-1200/1500 的采集通道在断线后重新握手,有两种办法——“让它自己连”或“手动踢它一脚”。
自动重连(推荐)
把系统变量 @ConnectionEstablishMode 置为 1(缺省就是 1),通道会每 4 s 自动尝试重建连接,无需干预 。
手动触发重连
① 强制断开:把 @ForceConnectionState 先写 0,已建立的连接会立即断开;
② 再次建立:再把 @ForceConnectionState 写 1,通道立即按组态参数重新连接 。
如果同时想换 IP 或访问点,可先把新地址写入 @AlternateConnectionAddress,再把 @ForceConnectionAddress 切换一次
0→1,也能达到“断开-重连”的效果 。
脚本里一般用 C 动作或 VBS 给这几个内部变量赋新值即可,触发一次执行一次重连流程

251224-MongoDB-SlowQuery慢查询定位

1. 直接读 system.profile(最常用)


打开数据库级别的 Profiling

1
2
use vatti
db.setProfilingLevel(1, 500); -- 记录 >50 ms 的操作

2. 可看到慢查询字段

1
2
3
4
db.system.profile.find({millis:{$gte:500}})
.sort({ts:-1})
.limit(1000)
.pretty();

251210-google-chrome-bookmark-谷歌浏览器导出书签

谷歌浏览器如何导出书签
?众所周知谷歌浏览器是一款强大的浏览工具,这款浏览器界面简洁,可以安装各式各样好用的插件,我们还能对浏览器进行个性化设置,在这款浏览器里添加的书签可以导出来,在其他的浏览器里打开,不少用户刚开始使用这款浏览器,还不清楚如何将书签导出。本篇文章就给大家带来轻松导出谷歌浏览器书签导出详细步骤,有需要的朋友不妨来跟着我一起学习看看。

img

谷歌浏览器书签导出详细步骤

1、第一步,我们打开谷歌浏览器电脑版,然后在浏览器页面右上角点击打开三个竖点图标

img

2、第二步,打开三个竖点图标之后,我们在菜单列表中打开“书签和清单”选项,再在子菜单列表中打开“书签管理器
”选项

img

3、第三步,在书签管理器页面中,我们点击打开页面右上角的管理图标

img

4、第四步,打开书签管理器页面的管理图标之后,我们在菜单列表中打开“导出书签”选项

img

5、第五步,最后在文件夹页面中,我们选择好保存位置,再设置好书签文件名,最后点击“保存”选项即可

img

以上就是《谷歌浏览器如何导出书签》的详细内容啦,感谢大家的阅读,希望这篇文章可以帮助到大家。