Ubuntu重启后NVIDIA驱动故障解决

问题描述

服务器重启后,图形界面频繁黑屏/闪退,同时命令行输入nvidia-smi报错无法连接到驱动。

由于网络配置问题,重启后默认采用已失效的旧配置,导致联网失败。

解决过程

  1. 解决图形化界面和联网问题

由于显卡驱动故障,电脑可能只能调用CPU加载图形界面,黑屏可能是操作过快导致的。因此,在开机/重启后一段时间内不要进行任何操作,以降低CPU负担。一段时间后再操作电脑,点击Ctrl+Alt+F1Ctrl+Alt+F2切换图形界面/命令行终端,就有机会可以顺利进入图形界面操作。

进入图形界面后需要修改网络设置,将已失效的旧配置文件删除,默认启用新配置文件(在图形界面的设置(Settings)中)。

  1. NVIDIA驱动修复

DeepSeek指出通常是系统内核与驱动版本不匹配导致的,给出了如下建议:

在Linux Ubuntu系统中,重启后出现nvidia-smi提示无法连接到NVIDIA驱动的问题,通常是由于系统内核更新导致驱动与内核版本不匹配引起的。以下是综合多篇搜索结果整理的具体解决方案:


方法一:通过DKMS重新生成驱动模块

  1. 安装DKMS工具
    DKMS(Dynamic Kernel Module Support)能够自动为内核外的驱动生成适配模块,避免因内核更新导致驱动失效。

    1
    sudo apt install dkms
  2. 查看当前NVIDIA驱动版本

    1
    ls /usr/src | grep nvidia  # 例如输出可能为nvidia-470.74
  3. 通过DKMS重新安装驱动模块
    使用查到的驱动版本号(如470.74)执行以下命令:

    1
    2
    sudo dkms install -m nvidia -v 470.74
    sudo reboot
    • 完成后通过dkms status确认模块状态。

方法二:切换回旧内核版本

如果内核自动更新后驱动失效,可手动切换回旧内核:

  1. 查看可用内核版本

    1
    2
    grep menuentry /boot/grub/grub.cfg  # 列出所有内核选项
    uname -r # 查看当前内核版本
  2. 修改GRUB默认启动项

    • 编辑GRUB配置文件:
      1
      sudo vim /etc/default/grub
    • 修改GRUB_DEFAULT的值,例如设置为旧内核的路径(如"1>3"表示选择第2个主菜单项下的第4个子项):
      1
      GRUB_DEFAULT="1>3"
    • 更新GRUB并重启:
      1
      2
      sudo update-grub
      sudo reboot

方法三:禁止内核自动更新

为避免后续内核更新导致驱动失效,可锁定内核版本:

  1. 禁用自动更新

    • 修改配置文件/etc/apt/apt.conf.d/10periodic/etc/apt/apt.conf.d/20auto-upgrades,将所有数值设为0以关闭自动更新。
    • 在“Software & Updates”中关闭自动更新选项。
  2. 锁定当前内核

    1
    sudo apt-mark hold linux-image-<当前内核版本>  # 例如linux-image-5.4.0-60-generic

方法四:重新安装NVIDIA驱动

若上述方法无效,可尝试彻底重装驱动:

  1. 卸载旧驱动

    1
    2
    sudo apt purge nvidia*
    sudo apt autoremove
  2. 安装匹配的驱动版本

    • 推荐使用官方驱动或ubuntu-drivers自动安装适配版本:
      1
      sudo ubuntu-drivers autoinstall  # 自动安装兼容驱动
    • 或手动下载驱动安装包,指定内核源码路径(需安装linux-headers-$(uname -r)):
      1
      sudo ./NVIDIA-Linux-x86_64-<驱动版本>.run --kernel-source-path=/usr/src/linux-headers-$(uname -r)

附加建议

  • 检查依赖环境
    若DKMS报错(如gcc版本不兼容),需切换GCC版本:
    1
    sudo update-alternatives --config gcc  # 选择兼容版本
  • 启用持久化模式
    解决nvidia-smi响应慢的问题:
    1
    sudo nvidia-persistenced --persistence-mode

总结

  • 优先使用DKMS:适合驱动版本与内核兼容但未正确加载的情况。
  • 切换内核或锁定版本:适合长期维护稳定性的场景。
  • 重装驱动:作为兜底方案,但需注意CUDA等依赖的兼容性。

如果问题反复出现,建议结合禁用内核更新和DKMS工具,以彻底解决问题。

运行dkms修复失败,因此选择了重新安装驱动的方法:

1
2
3
4
5
6
7
8
9
10
11
12
# 添加官方显卡驱动PPA
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update

# 查看推荐驱动版本
ubuntu-drivers devices

# 安装推荐版本(例如535版本)
sudo apt install nvidia-driver-535

# 重启生效
sudo reboot

matlab无GUI安装

问题描述

由于需要在服务器中安装matlab,但无法启动服务器的图形界面,尝试RDP连接等方式无果后,决定采用命令行安装。

安装过程

从网站上获取Matlab R2023b Linux安装包(R2023b_Linux.iso)

挂载到系统中:

1
2
3
sudo mount -r ./R2023b_Linux.iso ./installer 
cd ./installer
ls

挂载目录中即出现安装文件。其中install为安装脚本,installer_input.txt为安装配置文件。

设置访问权限:

1
sudo chmod 777 ./installer_input.txt

用vim打开安装配置文件

1
vim ./installer_input.txt

结合配置文件中的提示,修改配置参数,主要包括安装位置、安装文件密钥、需要安装的软件包内容等。

配置完成后运行安装脚本:

1
sudo ./install -inputFile ./installer_input.txt

如没有在安装配置文件中另外设置,Linux系统默认的安装日志文件应位于/tmp/mathworks_root.log路径。可打开文件查看安装结果。

1
vim /tmp/mathworks_root.log

完成安装后,环境变量可能没有被自动添加,可运行echo $PATH查看,或直接运行matlab命令查看。

手动添加环境变量:

  • 临时添加:

    1
    export PATH=$PATH:/usr/local/MATLAB/R2023b/bin
  • 为当前用户永久添加:

    1
    2
    vim ~/.bashrc # 在文件最后一行加入export PATH=$PATH:/usr/local/MATLAB/R2023b/bin
    source ~/.bashrc

注意事项

  1. 安装文件有.iso文件和.zip文件,前者体积较大(约10GB),后者较小(约200MB)。先前使用.zip文件解压后安装失败,经mathworks官网论坛问答结果提示,改用.iso文件进行安装。

  2. 如未使用sudo安装,日志文件的文件名应为/tmp/mathworks_{username}.log

  3. 以上安装步骤未包含激活

参考链接

https://blog.csdn.net/Alex497259/article/details/129865457
https://blog.csdn.net/weixin_44987694/article/details/129341420

样品倾转的计算:使用NiceGUI框架

起源

设想是做一个自动计算倾转α和β的程序,用来解决在倾转样品时计算倾转角的问题。

算法

之后再写

前端

计划使用NiceGUI框架。但是NiceGUI似乎不支持导出静态页面,不能发布到GitHub Pages上。

后续计划

  • 目前只实现了起点为001带轴的情形,且尚未经过大范围测试。
  • 之后会尝试添加非001带轴起始情形的支持,需要实现衍射花样的自动生成。
  • 提供静态页面生成的支持,包括以下可选的技术路线:
    • 基于NiceGUI生成的结果,手动制作网页模版
    • 调整前端技术路线,转向使用flask或nextjs(改用nextjs可能导致逻辑改写成js代码,增大工作量,除非采用前后端完全分离的策略)

Github pages deploy问题

描述

利用GitHub Action部署源码在master分支上的hexo框架页面时发现deploy步骤运行失败并报错:

1
2
error: Branch "master" is not allowed to deploy to github-pages due to environment protection rules.
error: The deployment was rejected or didn't satisfy other protection rules.

原因

由于从Deploy from branch切换到Github Action,生成页面的branch从gh-pages变为master,而原本的部署自动生成了名为github-pages的环境,并自动应用了对gh-pages分支的保护。当将source branch切换为master后,原保护规则并未自动修改,导致deploy因master分支无保护而失败。

解决

Settings > Environment > 删除github-pages环境

参考

https://github.com/orgs/community/discussions/39054

typescript安装问题

描述

使用yarn安装typescript时成功,但运行报错:

1
2
> tsc -v
tsc: command not found

原因

yarn路径未添加至环境变量,未找到yarn下载的typescript二进制文件

解决

  • 运行yarn global bin获取yarn二进制下载路径
  • 将路径添加至环境变量
    1
    export PATH=$PATH:/path/to/yarn/bin
    问题即解决。

学生节抽奖界面:后日谈

偶然接锅,开始干活

阿伟来寝室找我的时候,我还在写计组lab5。我看到ddl附近还有计组lab4lab5的ddl、媒体计算滤波小作业的ddl、量子力学第三章作业ddl、材科实验答辩ddl、量子力学期中,感到有点害怕。但由于好奇心,以及想要检验一下暑假自学前端三件套的成果,我打算先看看旧模板代码的情况再作决定。

我看到往年代码的结构还算清晰,而且代码量不是很大,除了css样式表行数达到800+以外。阿伟说wj忙ddl没空,估计去外面找人也麻烦,我就把这个锅接下来了。

理解代码结构

接完锅,我先用两天把lab5写完,然后就开始看代码结构。网页的js脚本用了jQuery框架,是我之前没学过的(之前只看了一些js的基础语法),所以面向搜索引擎先学了一手。但是css这里就比较费劲了,css3的3D效果我之前没有接触过(不得不说还真挺强大的),而且800多行的样式表层叠嵌套,还有很多冗余的代码(原框架预留,但往年版本的抽奖页面没有应用的)。

开始写

随机数生成

由于这次的抽奖要求变了,抽奖券上的信息是数字0~9和8种卡牌颜色以及8种键合方式,所以我打算生成0~779且十位不超过7的三位数,再用这个数经过处理来生成抽奖结果。

3d效果

模仿了原本的旋转效果写了竖转,还通过rotateZ(45deg)的暴力手段做出了甲方要求的斜转xs。场景的切换就通过容器的上下移动translateY,再靠transition形成的动画,把不要的容器上下移个2500px就完事。

爆写阶段

写到后面感觉在乱写,时间有点紧,也不管什么函数封装复用的了,只要不出bug就行,出了bug打个补丁,看着没事就行。写的速度飞快,就是不知道会不会在什么时候来一个bug。

代码乱七八糟的像*山,不过也不指望会有人再来维护它了,只要能跑就行(代码和人总得有一个能跑.jpg)人反正是跑不掉了。

收官debug

周日半夜2点,我把调完的代码打包发给cx,希望不会出什么问题。cx两点半回复说没啥问题(真的肝)。不过bug这种东西,不出意外肯定是要出意外的。

结果bug就在周日下午准时找上门来。我接到aw的消息说键合闪动动画出了点问题,只有一团黑白影子。兼容性这个东西就很难办,也不知道为啥大礼堂只能用mac,safari和chrome(edge)还是不一样的,就算我本地拿edge和firefox都测过也不知道safari会出什么问题。

我看完这个黑白影,估计是背景图片大小没设置好。研究了半天才打开safari的元素审查(感谢百度),一看发现在动画里已经把background-size设置成contain了。一直不知道是哪里出了问题,我就看着代码开始怀疑人生。怀疑半天也没用,干脆就在元素审查里面瞎改。改了一下还真改出来了:在动画外面加了一个contain莫名其妙就可以了。估计是safari的可动画化属性和edge/firefox不一样。

(顺带一提,我在我pad上的safari也没试出过这种问题)

来点感想

大一学生节是观众,大二学生节是演员,大三学生节是班剧里的酱油。大二大三都只是忙完自己的锅就溜了,毕竟第二天还有考试。大四这次把名字写在了工作人员列表里,完整看完了自己作为工作人员(虽然只负责了一个小小的抽奖,比忙里忙外的其它人水多了)的一届学生节。

听说这是最后一届了,随着招生计划的调整,这一届没有新生了。没有新生,没有招新,学生会或许就要解散了吧。大四了,明年就要毕业,九字班也要从材院离开了。能在本科的最后一年,能在最后一届学生节上献上这一份凝结着一周心力的代码作为last dance,这一周的努力绝对值得。

代码仓库及彩蛋

代码仓库github.com/Weslie0803/hack-lajidog/
网页预览weslie0803.github.io/hack-lajidog/

彩蛋:css中的.cubeShow_114514和html里的德语数字,都是在写得精神时常时候的发病产物罢了。

LeetCode日记

关于LeetCode评测的机制

2022年9月2日,天气忘记怎么样了,反正我在图书馆摸鱼的时候一时兴起想到了LeetCode第三题”无重复字符的最长子串”的算法,就随手写了。

不得不说很多时候还是要面向对象比较好写,所以定义了一个CharSet类,顺便就创建了一个charset对象。

蜜汁失败

我觉得我算法没问题了,所以拿默认测例跑了一下,顺便处理好边界情况。看着这边测试也没问题,我就点了提交。
结果在”bbbbb”这个测例莫名其妙给我报错,预计结果为1,但我的代码跑出来是0。因为对自定义测例的掌握还不太熟练,我脑子里跑了一下,觉得没问题。
为了排除评测机抽风的极小概率事件,我原样重新提交了一遍,结果还是没过。

等我折腾了几遍终于学会了手动设置测例,接着提交,发现”bbbbb”这个手动设置的测例正常输出了1的结果。我再次怀疑起是否存在在编译时宇宙粒子改变了评测机中的某几个bit的可能性,又交了一遍,结果证明:当前地球的辐射水平应该还是比较正常的。

原因分析(虚假的原因)

考虑到输出的结果0与我初始化变量的值一致,我怀疑是否是代码没有顺利进入循环。为此,我偷偷把初始化值改成了-1,
果然这个测例给我跑出了-1的结果。但我死活想不到为什么它不进循环。

解决的过程(应该是真实的原因)

在我不断检查代码的时候,我开始思考是否是因为定义对象的问题,毕竟这次是第一次在LeetCode里用面向对象写。

我意识到定义完类之后顺便创建的对象是在LeetCode的函数外面的,转而意识到这个对象是全局变量。我试着把对象的声明放进函数内部,然后就过了。

进一步分析

引出一个猜想,LeetCode的评测应当是在一次运行中多次调用其设置的函数接口来实现的。意即,两次调用间,全局变量不会被析构,这在我的算法中
就会影响最终的结果:每次计算前,我的对象是需要初始化的,这个初始化过程被我封装在构造函数中,只在对象创建时被调用。
“ddddd”可能是所有测例中的第二个,在正常运行完第一个测例后由于没有重置charset对象,影响了第二个测例的结果。

因此,在写题的时候还要考虑对象的生命周期问题,对这种情形,应当将对象的声明放在函数内部,使其在函数被调用时被构造,返回时被析构,从而执行构造函数中的初始化。

或者,其实也可以不把初始化放在构造函数中,而是另外定义一个初始化函数,在使用前调用初始化。

代码附上

  • 问题代码
    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
    class CharSet {
    int situ[128];
    public:
    CharSet(){
    for(int i = 0; i < 128; i++){
    situ[i] = -1;
    }
    }
    int AddInfo(char c, int si){
    int index = (int)c;
    int ret = situ[index];
    situ[index] = si;
    return ret;
    }
    } charset;


    class Solution {
    public:
    int lengthOfLongestSubstring(string s) {
    int slen = s.length();
    int Max_Length = -1;
    int Current_Length = 0;
    int le = 0, ri = 0;
    int sig;
    //线性读取
    for(ri = 0; ri < slen; ri ++){
    sig = charset.AddInfo(s[ri], ri);
    if(sig >= le){
    le = sig + 1;
    }
    Current_Length = ri - le + 1;
    if(Current_Length >= Max_Length){
    Max_Length = Current_Length;
    }
    }
    return Max_Length;
    }
    };
  • 通过代码
    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
    class CharSet {
    int situ[128];
    public:
    CharSet(){
    for(int i = 0; i < 128; i++){
    situ[i] = -1;
    }
    }
    int AddInfo(char c, int si){
    int index = (int)c;
    int ret = situ[index];
    situ[index] = si;
    return ret;
    }
    };


    class Solution {
    public:
    int lengthOfLongestSubstring(string s) {
    int slen = s.length();
    int Max_Length = -1;
    int Current_Length = 0;
    int le = 0, ri = 0;
    int sig;
    //线性读取
    for(ri = 0; ri < slen; ri ++){
    CharSet charset;
    sig = charset.AddInfo(s[ri], ri);
    if(sig >= le){
    le = sig + 1;
    }
    Current_Length = ri - le + 1;
    if(Current_Length >= Max_Length){
    Max_Length = Current_Length;
    }
    }
    return Max_Length;
    }
    };

铁电器件第一章:铁电材料概论

1.1 晶体结构和铁电性

电极化

三种来源:

  • 电子极化:响应THz~PHz,高于可见光频段
  • 离子极化:响应GHz~THz,微波频段
  • 偶极子转向极化:最多只能响应MHz~GHz频段的电场

因此

  • 折射率与介电常数关系式

    只在THz以上成立

  • 拥有永久性偶极子的铁电材料不能用作微波介电材料:低频率(kHz)下铁电材料的介电常数都非常高,但随外加电场频率增加而显著下降

电位移:

铁电体

电介质的自发极化能被外加电场翻转的材料

自发极化性能:某些晶体的正、负电荷中心,即使在没有外电场的情况下也不一定重合,这种晶体被称为具有自发极化性能。

32种点群,21种无对称中心,20种(除432外)具有压电性

压电:施加压力后,晶体表面产生正负电荷

热释电:温度变化时,晶体的自发极化发生变化,在晶体表面感应出相应的电荷

1.2 自发极化起源

  • 假定电偶极矩是离子A相对于晶格的位移引起
  • 离子位移是由一定温度下晶格的振动产生的
  • 某种特殊的晶格振动可以降低晶体的能量
    • 声学模式振动(仅氧八面体变形,不产生电偶极矩)
    • 光学模式振动(可以产生电偶极矩)
  • 随温度降低,振动模式的频率也会降低,到相变温度下振动频率降为0

理论推导

局部电场

  • $E^{loc}$:局部电场
  • $E_0$:外加电场
  • $\vec p_i$:偶极矩
  • $\gamma$ :洛伦兹因子,对各向同性的立方体系$\gamma = 1$
  • $\bf P$:极化强度

局部电场是离子移动的驱动力

若A离子的离子极化率为$\alpha$,晶胞中偶极矩

偶极矩能量

单位体积的偶极子数目为N,总能量

离子位移的弹性能

$k’>0$为高阶力常数。利用$P=Nqu$改写:

开口向上的二次函数。基于能量最低原理,分类讨论

  • 若二次函数对称轴在负半轴($\frac{k}{2Nq^2}-\frac{N\alpha\gamma^2}{9\varepsilon_0^2}\ge0$),最小值在$P=0$处取得。物理意义上,此时弹性能占据主要支配地位。
  • 反之,最小值在对称轴处($P^2=\left(\frac{2N\alpha\gamma^2}{9\varepsilon_0^2}-\frac{k}{Nq^2}\right)/\left(\frac{k’}{N^3q^4}\right)$)取得

一些结论

  • 钙钛矿型晶体具有更高的洛伦兹因子(=10),自发极化更容易在钙钛矿型晶体中发生

  • 晶体极化率$\alpha$对温度敏感(随温度升高而降低),因而导致相变。考虑一级近似,$\alpha$​与温度线性关系,得到居里-外斯定律(Curie-Weiss law)

例题1.1 计算BTO的自发极化值

buxiangxiele

1.3 场致应变的起源

  • 电致伸缩与逆压电效应的联系与区别
    • 电致伸缩用于一般性描述场致应变,也常用于指代逆压电效应
    • 在固体理论中,逆压电效应被定义为一级机电耦合效应

      应变与外加电场成正比

    • 电致伸缩是二级耦合效应

      应变与电场强度的平方成正比

    • 铁电体的压电性来自于电致伸缩的相互作用,因此以上两种效应具有一定的关联性。且当目标材料为单畴单晶且外加电场时其结构相不发生改变,以上假设才成立。(实际铁电陶瓷中随铁电畴重新取向而产生应变)

220619Weslie都干了些啥

摸鱼的一天

后GPA时代第一天,摸鱼

这一天,Weslie打开了要看的paper,寄出了招生用的物资,在干活与摸鱼划水间游走,感觉不太对劲。

招生物资

昨天(6月18日)Weslie从能科楼A座领到了物资,在大雨降下之前运回了宿舍。今年东西很多,有9件衣服,15本手册,6本台历,感觉比去年翻了一倍。

今天去快递点把东西寄到云鹏家,排了一小会儿队。物资有点重(其实昨天运回来的时候就感受到了),称完发现有10.4kg。在lzc同学建议下求稳寄了快件,花费¥110+,害怕。

看paper

为了准备组会,必须要打开paper了。这次还是继承发扬了一看paper就摸鱼的传统,看了几段就莫名其妙走上的摸鱼的路线,直到突然发现自己摸鱼的悲惨事实(指莫名其妙打开了Poly Bridge,然后因为造桥略烧脑而突然醒悟)。

把一些笔记记在了typora里,结果傍晚蜜汁重启,全部木大(虽然文档里本来就没有什么东西,很快就恢复了

paper的阅读进度在摸鱼中螺旋前进,争取在睡觉之前推到第5页吧(悲)

联系实验

早上给师姐发了微信,师姐没有回(

下午寄完快递后追加了一条,终于收到了回应,辛苦师姐了[捂脸]

明天重新回实验室干活,和师姐聊聊,也和老师聊一聊,包括返校规定啥的。

感觉组会准备进度要提一下了

眼镜

饱受眼镜腿折磨了好几天,今天终于决定去眼镜店问问镜框。

可惜没有找到大小、价格都合适的镜框,改天去万人看看好了。

顺便去书店和超市逛了一下,没有想买的书,买了一些好吃的。

正义摸鱼

做完核酸去篮球场小摸一会儿,时隔2年的第一次投篮(

开局毫无手感,感觉不知道投篮是啥了,虽然本来就没什么水平,但是投篮还是太离谱了一点。

投了几个还是找回了一点手感。开始时候喜欢单手投,拜托,完全没这个能力好吧(虽然上篮还是能放进去几个的)

后面找到双手投篮的手感就好一些了,但是还是有点糟糕,一个三分都没进。

防守也是完全业余的状态(我本来就是完全业余啊~[旺柴]

开心就好 :doge [狗头]

First Blog

It’s my first page to launch my blogs. What fun!

Self Introduction

Undergraduate student in School of Material Science and Engineering, Tsinghua University

Major in Material Science and Engineering

Minor in Computer Science and Engineering