Hello World

README

(ALL-AI)即刻去做&愿有前程可奔赴&亦有岁月可回头

Welcome to Hexo! This is your very first post. Check documentation for more
info. If you get any problems when using Hexo, you can find the answer
in troubleshooting or you can ask me
on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

260123-windows 11 开机后必须在电脑上输入密码后,才能远程,是怎么回事


SUCCESS

计算机配置 → 管理模板 → Windows组件 → 远程桌面服务 → 远程桌面会话主机 → 安全

3. Administrator账户是否被禁用

1
Win+R → lusrmgr.msc → 用户 → Administrator → 取消勾选"账户已禁用"

4. 远程桌面服务的安全层设置

1
2
Win+R → gpedit.msc
计算机配置 → 管理模板 → Windows组件 → 远程桌面服务 → 远程桌面会话主机 → 安全

检查这两项:

  • “要求使用网络级别的身份验证…” → 设为已启用(推荐)或已禁用测试
  • “设置客户端连接加密级别” → 设为已禁用或”客户端兼容”

5. 防火墙是否放行

1
2
控制面板 → Windows Defender 防火墙 → 允许应用通过防火墙
确认"远程桌面"勾选了"专用"和"公用"

6. 最粗暴测试:先关掉NLA

1
2
gpedit.msc → 计算机配置 → 管理模板 → Windows组件 → 远程桌面服务 → 远程桌面会话主机 → 安全
"要求使用网络级别的身份验证..." → 已禁用

重启后再试。如果能连,说明是NLA凭据问题;如果连不上,是网络或防火墙问题。


SUCCESS

想让“重启后远程直接能连”,就得让系统在开机后自动完成一次交互式登录,把会话跑起来。做法有两种:

  1. 注册表手动写 AutoAdminLogon(备用方案)

  2. Win+R → regedit

  3. 定位到
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

  4. 右侧新建/修改以下键值(都是 REG_SZ):

    1
    2
    3
    4
    AutoAdminLogon = 1
    DefaultUserName = Administrator
    DefaultDomainName = . (或你的计算机名)
    DefaultPassword = 你的密码
  5. 重启即可。

安全提醒

  • 自动登录等于把密码明文存在注册表(或 netplwiz 保管),任何能物理接触机器的人都能看到;只建议在受控的机房/家里使用。
  • 如果机器要放在公网,最好改用“开机后先本地输一次密码”的手动方式,或者给 BIOS/BitLocker 加电口令,再配 VPN 跳板,而不是单纯依赖自动登录。

这是 Windows 11 的默认安全机制:
如果本地还没“真正”用密码登录过一次,系统里就没有缓存可供 NLA(网络级身份验证)使用的凭据,远程桌面就会直接拒绝连接,表现为“必须先在本机输完密码,远程才能连”。

为什么会这样

  1. 很多人第一次激活系统用的是 Microsoft 账号,但随后只设了 PIN 或 Windows Hello 刷脸/指纹。

  2. PIN/Hello 只能解锁“已登录的本地会话”,不能当作 NLA 的凭据;而 Microsoft 账号的密码又从未在本地输入过,所以缓存里找不到有效凭据。

  3. 远程桌面服务启动时,NLA 阶段就要求出示“用户名+密码”,本地没有缓存只能失败,于是出现“必须本地先登录一次”的现象

解决思路(任选其一,推荐前两种)

  1. 本地用“账号密码”重新登录一次 a. 先锁屏 Win+L → 登录选项 → 选“密码”并输入 Microsoft 账号密码。 b.
    成功后该凭据会被缓存,今后无需再本地登录即可远程 。

  2. 干脆新建一个本地管理员,专门做远程

    1
    2
    3
    powershell
    net user rdpuser 你的密码 /add
    net localgroup administrators rdpuser /add

然后在“设置 → 系统 → 远程桌面 → 远程桌面用户”里把 rdpuser 加进去。以后远程就用这个本地账户即可

  1. 关闭“仅允许 Windows Hello 登录” 设置 → 账户 → 登录选项 → 关闭“为提高安全性,仅允许 Windows Hello 登录 Microsoft
    账号”。这样你就能在锁屏界面直接选“密码”,完成一次缓存 。

  2. 组策略放行“空密码”(仅家庭版不可用)

  3. 彻底关掉 NLA(降低安全性)

一句话总结
“先本地输一次密码”只是为了让 Windows 把真正的账号密码缓存下来;只要凭据存在,远程桌面就能在 NLA 阶段完成验证,之后再也不需要本地先登录。按上面
1 或 2 操作即可根治。

可以,直接把“Administrator”设为远程桌面用户即可,不需要再新建一个 rdpuser。
步骤如下(Win11 专业版/企业版):

  1. 先在本机用 Administrator 的「密码」登录一次
    ‑ 锁屏 → 登录选项 → 选「密码」并输入 Administrator 的密码,让系统把凭据缓存下来;这是解决“必须本地先登录”的关键。

  2. 把 Administrator 加入「远程桌面用户」组
    Win+X → 终端(管理员) →

    1
    net localgroup "Remote Desktop Users" administrator /add
  3. 确认远程桌面已开启
    设置 → 系统 → 远程桌面 → 打开「启用远程桌面」。

  4. 客户端连接时
    用户名填 .\Administrator(或计算机名\Administrator),再输入密码即可直接远程,无需再本地先登录。

注意

  • 如果系统用的是 Microsoft 在线账号,密码要输入「Microsoft 账号密码」而不是 PIN/Hello。

  • 出于安全考虑,建议给 Administrator 设一个强密码,并在路由器或防火墙里限制可访问 3389 的 IP 范围


260121-Ubuntu生成docker证书

Docker启用TLS加密解决暴露2375端口引发的安全漏洞,被黑掉三台云主机的教训总结

1. 设置主机名

编辑/etc/hostname,服务器主机名 ubuntu

1
vi /etc/hostname

2. 生成TLS证书

创建证书生成脚本 docker-cert.sh,放置/script目录

1
2
3
sudo mkdir -p /script /data/cert/docker
sudo touch /script/docker-cert.sh
sudo vim /script/docker-cert.sh

docker-cert.sh添加内容

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
#!/bin/bash

set -e
if [ -z $1 ];then
echo "请输入Docker服务器主机名"
exit 0
fi
HOST=$1
mkdir -p /data/cert/docker
cd /data/cert/docker
openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 3650 -key ca-key.pem -sha256 -out ca.pem
openssl genrsa -out ca-key.pem 4096
openssl req -subj "/CN=$HOST" -sha256 -new -key ca-key.pem -out server.csr
# 配置白名单,推荐配置0.0.0.0,允许所有IP连接但只有证书才可以连接成功
# 创建证书时,您需要提供 localhost 作为主题备用名称。您可以通过提供以下附加参数来做到这一点:-ext "SAN:c=DNS:localhost,IP:127.0.0.1"
# echo subjectAltName = DNS:$HOST,IP:0.0.0.0 > extfile.cnf
# echo subjectAltName = DNS:localhost,IP:0.0.0.0 > extfile.cnf
echo subjectAltName = IP:$HOST,IP:0.0.0.0 > extfile.cnf

openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-key.pem -extfile extfile.cnf
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile.cnf
openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
rm -v client.csr server.csr
chmod -v 0400 ca-key.pem key.pem ca-key.pem
chmod -v 0444 ca.pem server-key.pem cert.pem

执行 docker-cert.sh 脚本,生成证书放置 /data/cert/docker 目录中

1
2
3
4
5
# ubuntu是服务器的主机名
sh /script/docker-cert.sh ubuntu
sh /script/docker-cert.sh VM-12-11-centos (密码: ubuntu666)
sh /script/docker-cert.sh ubuntu (密码: ubuntu666)
sh /script/docker-cert.sh VM-12-4-ubuntu (密码: ubuntu666)

按照提示输入相关信息,密码一致就行,其他信息可留空,等脚本指定完成之后,可在 /data/cert/docker 目录查看到生成的证书。

Docker 只接受「未加密的私钥」

你给的 .key 文件是 RSA 加密私钥(文件头里能看到 —–BEGIN RSA PRIVATE KEY—– 或 Proc-Type: 4,ENCRYPTED),启动时 dockerd
要求你输入密码,但它跑在 systemd 里没人交互,于是读密钥失败 → TLS 配置无效 → dockerd 直接退出。
一句话结论
私钥被加密了,Docker 不会解密,必须换成“无密码”的私钥。

如果私钥仍带密码,先按前面说的去密码:

1
2
3
sudo openssl rsa -in server-key.pem -out server-key-clear.pem
sudo mv server-key-clear.pem server-key.pem
sudo chmod 600 server-key.pem

证书生成过程问题解决

OpenSSL 报错写得很清楚:

1
bad ip address … value=ubuntu

你在 extfile.cnf 里把 主机名ubuntu)直接写进了 IP: 字段,而 IP: 后面必须是纯 IPv4/IPv6 地址,不能是字符串域名或主机名。
改成 DNS:ubuntu 或者干脆去掉域名,只保留合法 IP 即可。

修正扩展文件

1
2
3
cat > extfile.cnf <<EOF
subjectAltName = DNS:ubuntu,IP:127.0.0.1,IP:10.0.0.0/8
EOF

如果你只想让任何地址都能连,也可以最简写:

1
echo "subjectAltName = IP:0.0.0.0" > extfile.cnf

重新签发

1
2
3
4
openssl x509 -req -in server.csr \
-CA ca.pem -CAkey ca-key.pem -CAcreateserial \
-out server-cert.pem -days 3650 -sha256 \
-extfile extfile.cnf

验证

1
openssl x509 -in server-cert.pem -text -noout | grep -A1 "Subject Alternative Name"

应看到:

1
2
X509v3 Subject Alternative Name:
DNS:ubuntu, IP:127.0.0.1, IP:0.0.0.0/8

不再报错即可。

查看生成后的证书

img

3. 配置Docker启用TLS

1
2
sudo cat /usr/lib/systemd/system/docker.service
sudo vim /usr/lib/systemd/system/docker.service

在ExecStart属性后追加

1
2
3
4
--tlsverify --tlscacert=/data/cert/docker/ca.pem  \
--tlscert=/data/cert/docker/server-cert.pem \
--tlskey=/data/cert/docker/server-key.pem \
-H tcp://0.0.0.0:2376 -H unix://var/run/docker.sock
1
--tlsverify --tlscacert=/data/cert/docker/ca.pem --tlscert=/data/cert/docker/server-cert.pem --tlskey=/data/cert/docker/server-key.pem -H tcp://0.0.0.0:2376 -H unix://var/run/docker.sock 

img

重新加载docker配置后重启

1
2
3
4
5
6
7
8
9
10
11
12
sudo systemctl daemon-reload 
sudo systemctl restart docker

sudo journalctl -u docker.service -n 50

# 检查是否加密 如果提示 Enter pass phrase,就说明被加密了。
sudo openssl rsa -in /data/cert/docker/ca-key.pem -check -noout

调试验证
>> /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --tlsverify --tlscacert=/data/cert/docker/ca.pem --tlscert=/data/cert/docker/server-cert.pem --tlskey=/data/cert/docker/server-key.pem -H tcp://0.0.0.0:2376 -H unix://var/run/docker.sock

sudo systemctl daemon-reload && sudo systemctl restart docker

查看2376端口是否启动

1
netstat -nltp | grep 2376

img

本地连接测试Docker API是否可用

  • 没有指定证书访问测试
1
2
curl https://ubuntu:2376/info 
curl https://127.0.0.1:2376/info
  • 指定证书访问测试
1
2
3
4
5
6
7
curl https://ubuntu:2376/info --cert /data/cert/docker/cert.pem --key /data/cert/docker/key.pem --cacert /data/cert/docker/ca.pem

curl https://127.0.0.1:2376/info --cert /data/cert/docker/cert.pem --key /data/cert/docker/key.pem --cacert /data/cert/docker/ca.pem

curl https://ubuntu:2376/info --cert /data/cert/docker/cert.pem --key /data/cert/docker/key.pem --cacert /data/cert/docker/ca.pem

https://ubuntu:2376

4. IDEA配置

将客户端所需的ca.pem、cert.pem、key.pem3个密钥文件从服务器下载到本地

img

IDEA连接Docker配置修改

img

pom.xml

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

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<executions>
<!--执行mvn package,即执行 mvn clean package docker:build-->
<execution>
<id>build-image</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>

<configuration>
<!-- 镜像名称 -->
<imageName>${project.artifactId}</imageName>
<!-- 指定标签 -->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!-- 基础镜像-->
<baseImage>openjdk:8-jdk-alpine</baseImage>

<!-- 切换到容器工作目录-->
<workdir>/</workdir>

<entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint>

<!-- 指定远程 Docker API地址 -->
<dockerHost>https://ubuntu:2376</dockerHost>
<!-- 指定tls证书的目录 -->
<dockerCertPath>C:\certs\docker\ubuntu</dockerCertPath>

<!-- 复制 jar包到docker容器指定目录-->
<resources>
<resource>
<targetPath>/</targetPath>
<!-- 用于指定需要复制的根目录,${project.build.directory}表示target目录 -->
<directory>${project.build.directory}</directory>
<!-- 用于指定需要复制的文件,${project.build.finalName}.jar就是打包后的target目录下的jar包名称 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>

260121-ubuntu 域名ping 提示Temporary failure in name resolution-ping-baidu.com

ubuntu 域名ping 提示Temporary failure in name resolution

只要 任何域名 都报 Temporary failure in name resolution,就是 本机 DNS 解析链彻底断了,与具体域名无关。
Ubuntu 20.04+ 默认走 systemd-resolved,90 % 是它没跑 / 配置丢失 / 上游 DNS 无响应。
按下面「4 句命令 → 1 次验证」一次性修好即可:


  1. 确认 systemd-resolved 活着

1
systemctl is-active systemd-resolved || sudo systemctl enable --now systemd-resolved

  1. 把 /etc/resolv.conf 指向本地 stub

1
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

确保文件第一行是

1
nameserver 127.0.0.53

  1. 给 resolver 换可靠的公共 DNS

1
2
3
sudo mkdir -p /etc/systemd/resolved.conf.d
echo -e "[Resolve]\nDNS=8.8.8.8 1.1.1.1" | sudo tee /etc/systemd/resolved.conf.d/99-public.conf
sudo systemctl restart systemd-resolved

  1. 一键验证

1
systemd-resolve google.com && ping -c3 google.com

能解析、能 ping 通就表示修复完成,再去跑你的证书脚本即可。

260119-linux-redis离线安装

一、准备工作

1.下载redis的安装包

下载地址:Index of /releases/

大家可以自行选择redis的版本,笔者选择的是最新的

https://download.redis.io/releases/

img

2.上传到服务器
前提是我先在服务器上创建了一个目录redis7.2.3,我直接上传到这个目录下

二、安装redis
1.解压redis
tar -zxvf redis-7.2.3.tar.gz
AI写代码
2.移动解压完成的目录到/usr/local/下
mv redis-7.2.3 /usr/local/
AI写代码
3.进入到redis-7.2.3的目录
cd /opt/data/iimes/soft/redis-8.4.0
AI写代码
4.编译安装
make install
等待安装

安装完成的目录结构如下:

三、修改配置文件 redis.conf
vim redis.conf

1.设置远程访问
注释掉 bind 127.0.0.1 -::1 这句话意思是 只在本地访问!你不注释掉,到时候你本地RDM 是链接不上的。或者改为 bind 0.0.0.0

2.修改 登陆redis的密码 如图:
作者为了图方便,改为了123456.

3.设置后台启动
将daemonize no 改为 daemonize yes

四、将redis添加到守护进程,并开启开机自启动
1.在/etc/systemd/system/ 目录下创建文件redis.service
/etc/systemd/system目录是Linux系统中用于存放systemd单元配置文件的位置。systemd是一个系统和服务管理器,负责启动、停止和管理系统进程

vim /etc/systemd/system/redis.service
AI写代码
2.添加如下内容
大家注意区分,对于下面/opt/data/iimes/soft/redis-8.4.0/src/redis-server中的 src 是根据redis的安装目录来的,有些是 bin
大家注意观察自己的redis的目录,根据实际情况填写。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Redis
After=network.target

[Service]
Type=forking
ExecStart=/opt/data/iimes/soft/redis-8.4.0/src/redis-server /opt/data/iimes/soft/redis-8.4.0/redis.conf
ExecStop=/opt/data/iimes/soft/redis-8.4.0/src/redis-server -s stop
PrivateTmp=true
User=root
Group=root

[Install]
WantedBy=multi-user.target

保存并退出

3.设置开机自启
systemctl enable redis
AI写代码
4.添加环境变量
(1)可以直接在/etc/profile文件末尾直接添加

vim /etc/profile

export PATH=$PATH:/opt/data/iimes/soft/redis-8.4.0/src
AI写代码
(2)或在profile.d目录下新建一个,专门放redis的环境变量文件

进入/etc/profile.d/路径下新建redis.sh

vim /etc/profile.d/redis.sh

在redis.sh文件中新增以下内容

export PATH=$PATH:/usr/local/redis/src

5.刷新环境变量
source /etc/profile
AI写代码
6.重启redis
systemctl restart redis
AI写代码
说明:如果后续大家还重新修改了/etc/systemd/system/redis.service文件,启动redis时出现提醒:Warning: The unit file, source
configuration file or drop-ins of redis.service changed on disk. Run ‘systemctl daemon-reload’ to reload units

重新执行命令:systemctl daemon-reload

这个警告提示您的 redis.service 单元文件、源配置文件或附加配置文件在磁盘上发生了变化。为了加载这些变化,您需要运行 systemctl
daemon-reload 命令来重新加载单元。

五、验证
1.查看redis的运行状态

2.查看redis进程

3.使用命令连接客户端
redis-cli

进入之后,需要你输入密码才能获取到redis输出的信息(info)

auth 密码

或者 之前在连接的时候输入密码:

redis-cli -a

260119-Ubuntu20-04(netplan apply)系统启动后直接加载固定路由-系统启动固定路由

作用:(Ubuntu20.04系统启动后直接加载固定路由)让本机一启动就把 192.168.0.2 / .4 / .102 / .104 / .106 这 5 个地址“当成跟自己同一链路(link)上的邻居”,无需网关即可直达,ARP 解析后直接发包。

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
network:
ethernets:
eno1:
dhcp4: no
addresses: [192.168.0.100/24]
routes:
- to: default
via: 192.168.0.1
scope: link
metric: 10
enp1s0:
dhcp4: no
addresses: [192.168.0.110/24]
dhcp4-overrides:
use-routes: false # 拒绝 DHCP 下发的默认路由
routes: # 你的 5 条主机路由
- to: 192.168.0.2/32
scope: link
- to: 192.168.0.4/32
scope: link
- to: 192.168.0.102/32
scope: link
- to: 192.168.0.104/32
scope: link
- to: 192.168.0.106/32
scope: link
version: 2
wifis: {}

260119-Ubuntu20.04系统启动后直接加载固定路由-/etc/systemd/network/10-enp1s0.network

作用:(Ubuntu20.04系统启动后直接加载固定路由)让本机一启动就把 192.168.0.2 / .4 / .102 / .104 / .106 这 5 个地址“当成跟自己同一链路(link)上的邻居”,无需网关即可直达,ARP 解析后直接发包。

目录位置: /etc/systemd/network/10-enp1s0.network

配置完成,重启(sudo systemctl enable systemd-networkd)

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
[Match]
Name=enp1s0

[Network]
DHCP=yes

# 下面 5 行就是固定路由
[Route]
Destination=192.168.0.2/32
Scope=link

[Route]
Destination=192.168.0.4/32
Scope=link

[Route]
Destination=192.168.0.102/32
Scope=link

[Route]
Destination=192.168.0.104/32
Scope=link

[Route]
Destination=192.168.0.106/32
Scope=link

260119-260119-Ubuntu20-04(systemd-networkd&netplan apply不能共用谁先启动谁就把另一份冲掉)

你现在同时用了两条“指挥棒”:

  1. /etc/systemd/network/10-enp1s0.network
    手工写给 systemd-networkd 的“原生”配置,让 enp1s0 走 DHCP,但禁止默认路由。
  2. /etc/systemd/system/50-cloud-init.yaml(应为 /etc/netplan/50-cloud-init.yaml
    写给 netplan 的 YAML,把 eno1、enp1s0 都设成静态地址,且声明 renderer: networkd(你没写,但 Ubuntu 服务器版默认就是
    networkd)。

问题就出在“同一接口被两边描述”

  • netplan 在 netplan apply 或开机时,会重新生成
    /run/systemd/network/10-netplan-enp1s0.network

这样有冲突吗

有冲突,而且重启后只能有一半配置生效——谁先启动谁就把另一份冲掉。

  1. 两套“管理员”
    • /etc/systemd/network/10-enp1s0.networksystemd-networkd 直接读取
    • /etc/systemd/system/50-cloud-init.yamlcloud-init 留给 netplan 的,netplan apply 时会根据它生成
      /run/systemd/network/10-netplan-eno1.network
      /run/systemd/network/10-netplan-enp1s0.network
      然后重启 systemd-networkd
      结果:networkd 重启后会把 /run/… 下面的“临时文件”当做最新配置,/etc 里你手写的那份就被静默覆盖了。
  2. 冲突点
    • 对 enp1s0 的定义完全矛盾:
      – 你手写版:DHCP=yes,还要加 5 条主机路由
      – netplan 版:dhcp4: no,addresses: [192.168.0.110/24]
      重启后最后生效的是 netplan 生成的“静态地址”版本,DHCP 和 5 条路由全部丢失。
  3. 对 eno1 的影响
    netplan 会把 eno1 的默认路由 metric=10 写进 /run/…/10-netplan-eno1.network,和你手工文件不冲突(因为没手写 eno1),但*
    *一旦以后你想手动改 eno1,也会遇到同样被覆盖的问题**。
  4. 结论 & 做法
    “一个接口只能由一个管家管”
    选 A 或选 B,不要混用:
    选 A 或选 B,不要混用:
    选 A 或选 B,不要混用:
    选 A 或选 B,不要混用:

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