安装与卸载之卸载篇---程序自杀

本文介绍了一种使程序能够自我删除的方法,即程序自杀。利用批处理文件和Delphi编程技巧,文章详细解释了如何让程序在运行时删除自身所在目录下的文件。

 安装与卸载之卸载篇---程序自杀
                                                       陈经韬

搜索关键字:程序自杀 自删除 强制删除

      电脑用得久了,安装的软件乱七八糟,怎么办?一般我们会打开控制面版里的添加删除程序选项,选择相应的卸载选项就可以了。但如果我们能在自己的程序中增加一个删除功能来实现“自杀”,则会令软件增色不少。
     有点电脑常识的人都知道,在Windows下如果程序正在运行,那么是无法将其删除的,当然,也不是绝对不可以。CIH大家应该知道吧,它的核心有两个,一个就是取得Ring0级权限,然后就可以随便干想干的事(比如说修改正在运行的文件),而我们一般的程序是运行在Ring3级上的。顺便提一句---NT下没有Ring的概念,所以CIH对其无效。用Delphi内镶汇编也可以取得Ring0级权限,但如果我们的程序运行在NT或者Win2000下就没有效果了。在说句题外话,现在的编译器都很不错了,大多数程序员都编不出比编译器编译出的更理想的代码,象Delphi,如果将它的某些单元代码改用内镶汇编,在某些方面如字符串处理方面会提高5倍左右的效率,但NT不支持某些汇编代码,如果程序在NT下工作就会出错,怎么办?稳定第一!所以我们不用这个方法,而且,用这个方法有点杀鸡用牛刀的味道。
   用过DOS的朋友应该还记得批处理文件吧,新建一个批处理文件a.bat,编辑其内容为:del %0,然后运行它,怎么样?a.bat把自己删除掉了!!!好,我们就用它来进行程序的“自杀”!
找一个EXE可执行文件,比如说abc.exe,新建一个批处理文件a.bat,编辑其内容为:
:pp
del abc.exe
if exist abc.exe goto pp
del %0
先运行abc.exe,再运行a.bat,然后将abc.exe退出,你会发现a.exe和a.bat都没有了!!!按照这个思路,我们可以在程序中根据文件名称写一个批处理,将上面的abc.exe换成自己的EXE文件名就可以了。运行Delphi,新建一个工程,添加一个Button到窗体上,点击Button,写下如下代码:

procedure TForm1.Button1Click(Sender: TObject);
var Selfname,BatFilename,s1,s2:string;
BatchFile: TextFile;
begin
Selfname:=Extractfilename(application.exename);//取EXE文件自己的名称
BatFilename:=ExtractFilePath(Application.ExeName)+ 'a.bat';//批处理文件名称
S1:='@del '+Selfname;
S2:='if exist '+Selfname+' goto pp';
assignfile(BatchFile,BatFilename);
rewrite(BatchFile);
writeln(BatchFile,':pp');
writeln(BatchFile,S1);
writeln(BatchFile,S2);
writeln(BatchFile,'@del %0');
closefile(BatchFile);
winexec(pchar(BatFilename),sw_hide);//隐藏窗口运行a.bat
application.Terminate;//退出程序
end;
那我们的事情是不是就完了?NO!上面的程序原理是对的,但如果你的程序是运行在系统目录下如Windows目录下或者Windows/System等目录下,除非你打开那个目录看着它删除,否则根本没法卸掉的。这可能是因为Windows对系统目录有保护功能,那怎么办?别急,我们请出一个函数CreateProcess,它的原型为:
BOOL CreateProcess(
LPCTSTR lpApplicationName, // pointer to name of executable module
LPTSTR lpCommandLine, // pointer to command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // pointer to process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes
BOOL bInheritHandles, // handle inheritance flag
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // pointer to new environment block
LPCTSTR lpCurrentDirectory, // pointer to current directory name
LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO
LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION
);
这个函数和OpenProcess、ReadProcessMemory、WriteProcessMemory使用可以用来读取和修改内存数据,常用的游戏修改器就是用它。由于这些不是本文的重点所以这里不作详细介绍,感兴趣的读者可自行翻阅Delphi自带的帮助文件。用CreateProcess函数创建一个进程就可以完美的完成我们的“程序自杀”了。
运行Delphi,新建一个工程,添加一个Button到窗体上,全部代码如下:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure My_DeleteMe; //自定义程序自杀过程
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
My_DeleteMe;
end;
procedure TForm1.My_DeleteMe; //程序自杀
var
BatchFile: TextFile;
BatchFileName: string;
ProcessInfo: TProcessInformation;
StartUpInfo: TStartupInfo;
begin
{By Lovejingtao.http://Lovejingtao.126.com,Lovejingtao@21cn.com}
BatchFileName := ExtractFilePath(ParamStr(0)) + '$$a.bat';
AssignFile(BatchFile, BatchFileName);
Rewrite(BatchFile);
Writeln(BatchFile, ':try');
Writeln(BatchFile, 'del "' + ParamStr(0) + '"');
Writeln(BatchFile,
'if exist "' + ParamStr(0) + '"' + ' goto try');
Writeln(BatchFile, 'del "' + BatchFileName + '"');
Writeln(BatchFile, 'cls');
CloseFile(BatchFile);
FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);
StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
StartUpInfo.wShowWindow := SW_HIDE;
if CreateProcess(nil, PChar(BatchFileName), nil, nil,
False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,
ProcessInfo) then
begin
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
end;
Application.Terminate;
end;
end.

补充:1、上面的批处理的 del %0等同于 del a.bat,用del a.bat则批处理文件必须为a.bat,用del %0则可以随意。
2、所有程序在Pwin98+Delphi5、Win2000+Delphi5下运行通过。
本文的标题为《安装与卸载之卸载篇》,下次将介绍如何用Delphi制作自己的安装程序。记得有一位著名的黑客说过:我从来不去找什么工具软件,需要的话就自己写一个。如果我们也持这种态度,则编程水平一定会越来越高。

软件包 nvidia-kernel-common-470 未安装,所以不会被卸载 软件包 nvidia-kernel-common-470-server 未安装,所以不会被卸载 软件包 nvidia-kernel-common-495 未安装,所以不会被卸载 软件包 nvidia-kernel-common-510 未安装,所以不会被卸载 软件包 nvidia-kernel-common-510-server 未安装,所以不会被卸载 软件包 nvidia-kernel-common-515 未安装,所以不会被卸载 软件包 nvidia-kernel-common-515-server 未安装,所以不会被卸载 软件包 nvidia-kernel-common-520 未安装,所以不会被卸载 软件包 nvidia-kernel-common-525 未安装,所以不会被卸载 软件包 nvidia-kernel-common-525-server 未安装,所以不会被卸载 软件包 nvidia-kernel-common-535-server 未安装,所以不会被卸载 软件包 nvidia-kernel-common-550-server 未安装,所以不会被卸载 软件包 nvidia-kernel-common-565-server 未安装,所以不会被卸载 软件包 nvidia-kernel-common-570-server 未安装,所以不会被卸载 软件包 nvidia-kernel-source-390 未安装,所以不会被卸载 软件包 nvidia-kernel-source-435 未安装,所以不会被卸载 软件包 nvidia-kernel-source-440 未安装,所以不会被卸载 软件包 nvidia-kernel-source-450 未安装,所以不会被卸载 软件包 nvidia-kernel-source-450-server 未安装,所以不会被卸载 软件包 nvidia-kernel-source-455 未安装,所以不会被卸载 软件包 nvidia-kernel-source-460 未安装,所以不会被卸载 软件包 nvidia-kernel-source-465 未安装,所以不会被卸载 软件包 nvidia-kernel-source-470 未安装,所以不会被卸载 软件包 nvidia-kernel-source-470-server 未安装,所以不会被卸载 软件包 nvidia-kernel-source-495 未安装,所以不会被卸载 软件包 nvidia-kernel-source-510 未安装,所以不会被卸载 软件包 nvidia-kernel-source-510-server 未安装,所以不会被卸载 软件包 nvidia-kernel-source-515 未安装,所以不会被卸载 软件包 nvidia-kernel-source-515-open 未安装,所以不会被卸载 软件包 nvidia-kernel-source-515-server 未安装,所以不会被卸载 软件包 nvidia-kernel-source-520 未安装,所以不会被卸载 软件包 nvidia-kernel-source-520-open 未安装,所以不会被卸载 软件包 nvidia-kernel-source-525 未安装,所以不会被卸载 软件包 nvidia-kernel-source-525-open 未安装,所以不会被卸载 软件包 nvidia-kernel-source-525-server 未安装,所以不会被卸载 软件包 nvidia-kernel-source-535-open 未安装,所以不会被卸载 软件包 nvidia-kernel-source-535-server 未安装,所以不会被卸载 软件包 nvidia-kernel-source-535-server-open 未安装,所以不会被卸载 软件包 nvidia-kernel-source-550-server 未安装,所以不会被卸载 软件包 nvidia-kernel-source-550-server-open 未安装,所以不会被卸载 软件包 nvidia-kernel-source-565-server 未安装,所以不会被卸载 软件包 nvidia-kernel-source-565-server-open 未安装,所以不会被卸载 软件包 nvidia-kernel-source-570-server 未安装,所以不会被卸载 软件包 nvidia-kernel-source-570-server-open 未安装,所以不会被卸载 软件包 nvidia-libopencl1-384 未安装,所以不会被卸载 软件包 nvidia-opencl-icd-340 未安装,所以不会被卸载 软件包 nvidia-opencl-icd-384 未安装,所以不会被卸载 软件包 nvidia-utils-390 未安装,所以不会被卸载 软件包 nvidia-utils-435 未安装,所以不会被卸载 软件包 nvidia-utils-440 未安装,所以不会被卸载 软件包 nvidia-utils-450 未安装,所以不会被卸载 软件包 nvidia-utils-450-server 未安装,所以不会被卸载 软件包 nvidia-utils-455 未安装,所以不会被卸载 软件包 nvidia-utils-460 未安装,所以不会被卸载 软件包 nvidia-utils-465 未安装,所以不会被卸载 软件包 nvidia-utils-470 未安装,所以不会被卸载 软件包 nvidia-utils-470-server 未安装,所以不会被卸载 软件包 nvidia-utils-495 未安装,所以不会被卸载 软件包 nvidia-utils-510 未安装,所以不会被卸载 软件包 nvidia-utils-510-server 未安装,所以不会被卸载 软件包 nvidia-utils-515 未安装,所以不会被卸载 软件包 nvidia-utils-515-server 未安装,所以不会被卸载 软件包 nvidia-utils-520 未安装,所以不会被卸载 软件包 nvidia-utils-525 未安装,所以不会被卸载 软件包 nvidia-utils-525-server 未安装,所以不会被卸载 软件包 nvidia-utils-535-server 未安装,所以不会被卸载 软件包 nvidia-utils-550-server 未安装,所以不会被卸载 软件包 nvidia-utils-565-server 未安装,所以不会被卸载 软件包 nvidia-utils-570-server 未安装,所以不会被卸载 软件包 nvidia-common 未安装,所以不会被卸载 软件包 nvidia-compute-utils-418-server 未安装,所以不会被卸载 软件包 nvidia-compute-utils-440-server 未安装,所以不会被卸载 软件包 nvidia-compute-utils-460-server 未安装,所以不会被卸载 软件包 nvidia-dkms-418-server 未安装,所以不会被卸载 软件包 nvidia-dkms-440-server 未安装,所以不会被卸载 软件包 nvidia-dkms-460-server 未安装,所以不会被卸载 软件包 nvidia-driver-418-server 未安装,所以不会被卸载 软件包 nvidia-driver-440-server 未安装,所以不会被卸载 软件包 nvidia-driver-460-server 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-450 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-460 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-470 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-510 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-dev-450 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-dev-460 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-dev-470 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-dev-510 未安装,所以不会被卸载 软件包 nvidia-headless-418-server 未安装,所以不会被卸载 软件包 nvidia-headless-440-server 未安装,所以不会被卸载 软件包 nvidia-headless-460-server 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-418-server 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-440-server 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-460-server 未安装,所以不会被卸载 软件包 nvidia-kernel-common-440-server 未安装,所以不会被卸载 软件包 nvidia-kernel-source-418-server 未安装,所以不会被卸载 软件包 nvidia-kernel-source-440-server 未安装,所以不会被卸载 软件包 nvidia-kernel-source-460-server 未安装,所以不会被卸载 软件包 nvidia-libopencl1-331 未安装,所以不会被卸载 软件包 nvidia-libopencl1-331-updates 未安装,所以不会被卸载 软件包 nvidia-libopencl1-340 未安装,所以不会被卸载 软件包 nvidia-libopencl1-340-updates 未安装,所以不会被卸载 软件包 nvidia-opencl-icd-331 未安装,所以不会被卸载 软件包 nvidia-opencl-icd-331-updates 未安装,所以不会被卸载 软件包 nvidia-opencl-icd-340-updates 未安装,所以不会被卸载 软件包 nvidia-utils-418-server 未安装,所以不会被卸载 软件包 nvidia-utils-440-server 未安装,所以不会被卸载 软件包 nvidia-utils-460-server 未安装,所以不会被卸载 软件包 nvidia-gds-11-7 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-520 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-dev-520 未安装,所以不会被卸载 软件包 nvidia-gds-11-8 未安装,所以不会被卸载 软件包 nvidia-kernel-open-520 未安装,所以不会被卸载 软件包 nvidia-gds-12-0 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-530 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-dev-530 未安装,所以不会被卸载 软件包 nvidia-kernel-open-530 未安装,所以不会被卸载 软件包 nvidia-kernel-open-515 未安装,所以不会被卸载 软件包 nvidia-container-runtime 未安装,所以不会被卸载 软件包 nvidia-docker2 未安装,所以不会被卸载 软件包 nvidia-gds-12-1 未安装,所以不会被卸载 软件包 nvidia-gds-12-2 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-525 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-dev-525 未安装,所以不会被卸载 软件包 nvidia-kernel-open-525 未安装,所以不会被卸载 软件包 nvidia-compute-utils-430 未安装,所以不会被卸载 软件包 nvidia-dkms-430 未安装,所以不会被卸载 软件包 nvidia-driver-430 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-545 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-dev-545 未安装,所以不会被卸载 软件包 nvidia-headless-430 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-430 未安装,所以不会被卸载 软件包 nvidia-kernel-common-430 未安装,所以不会被卸载 软件包 nvidia-kernel-open-545 未安装,所以不会被卸载 软件包 nvidia-kernel-source-430 未安装,所以不会被卸载 软件包 nvidia-utils-430 未安装,所以不会被卸载 软件包 nvidia-gds-12-3 未安装,所以不会被卸载 软件包 nvidia-firmware-550-550.54.14 未安装,所以不会被卸载 软件包 nvidia-firmware-550-550.54.15 未安装,所以不会被卸载 软件包 nvidia-gds-12-4 未安装,所以不会被卸载 软件包 nvidia-firmware-555-555.42.02 未安装,所以不会被卸载 软件包 nvidia-firmware-550-550.90.07 未安装,所以不会被卸载 软件包 nvidia-compute-utils-555 未安装,所以不会被卸载 软件包 nvidia-dkms-555 未安装,所以不会被卸载 软件包 nvidia-dkms-555-open 未安装,所以不会被卸载 软件包 nvidia-driver-555 未安装,所以不会被卸载 软件包 nvidia-driver-555-open 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-555 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-dev-555 未安装,所以不会被卸载 软件包 nvidia-firmware-555-555.42.06 未安装,所以不会被卸载 软件包 nvidia-gds-12-5 未安装,所以不会被卸载 软件包 nvidia-headless-555 未安装,所以不会被卸载 软件包 nvidia-headless-555-open 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-555 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-555-open 未安装,所以不会被卸载 软件包 nvidia-kernel-common-555 未安装,所以不会被卸载 软件包 nvidia-kernel-open-555 未安装,所以不会被卸载 软件包 nvidia-kernel-source-555 未安装,所以不会被卸载 软件包 nvidia-kernel-source-555-open 未安装,所以不会被卸载 软件包 nvidia-utils-555 未安装,所以不会被卸载 软件包 nvidia-firmware-560-560.28.03 未安装,所以不会被卸载 软件包 nvidia-imex 未安装,所以不会被卸载 软件包 nvidia-compute-utils-530 未安装,所以不会被卸载 软件包 nvidia-dkms-530 未安装,所以不会被卸载 软件包 nvidia-dkms-530-open 未安装,所以不会被卸载 软件包 nvidia-driver-530 未安装,所以不会被卸载 软件包 nvidia-driver-530-open 未安装,所以不会被卸载 软件包 nvidia-firmware-560-560.35.03 未安装,所以不会被卸载 软件包 nvidia-headless-530 未安装,所以不会被卸载 软件包 nvidia-headless-530-open 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-530 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-530-open 未安装,所以不会被卸载 软件包 nvidia-kernel-common-530 未安装,所以不会被卸载 软件包 nvidia-kernel-source-530 未安装,所以不会被卸载 软件包 nvidia-kernel-source-530-open 未安装,所以不会被卸载 软件包 nvidia-utils-530 未安装,所以不会被卸载 软件包 nvidia-firmware-550-550.90.12 未安装,所以不会被卸载 软件包 nvidia-firmware-550-550.127.05 未安装,所以不会被卸载 软件包 nvidia-compute-utils-565 未安装,所以不会被卸载 软件包 nvidia-dkms-565 未安装,所以不会被卸载 软件包 nvidia-dkms-565-open 未安装,所以不会被卸载 软件包 nvidia-driver-565 未安装,所以不会被卸载 软件包 nvidia-driver-565-open 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-565 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-dev-565 未安装,所以不会被卸载 软件包 nvidia-firmware-565-565.57.01 未安装,所以不会被卸载 软件包 nvidia-headless-565 未安装,所以不会被卸载 软件包 nvidia-headless-565-open 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-565 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-565-open 未安装,所以不会被卸载 软件包 nvidia-imex-565 未安装,所以不会被卸载 软件包 nvidia-kernel-common-565 未安装,所以不会被卸载 软件包 nvidia-kernel-open-565 未安装,所以不会被卸载 软件包 nvidia-kernel-source-565 未安装,所以不会被卸载 软件包 nvidia-kernel-source-565-open 未安装,所以不会被卸载 软件包 nvidia-open-565 未安装,所以不会被卸载 软件包 nvidia-utils-565 未安装,所以不会被卸载 软件包 nvidia-firmware-550-550.127.08 未安装,所以不会被卸载 软件包 nvidia-compute-utils-560 未安装,所以不会被卸载 软件包 nvidia-dkms-560 未安装,所以不会被卸载 软件包 nvidia-dkms-560-open 未安装,所以不会被卸载 软件包 nvidia-driver-560 未安装,所以不会被卸载 软件包 nvidia-driver-560-open 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-560 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-dev-560 未安装,所以不会被卸载 软件包 nvidia-firmware-560-560.35.05 未安装,所以不会被卸载 软件包 nvidia-gds-12-6 未安装,所以不会被卸载 软件包 nvidia-headless-560 未安装,所以不会被卸载 软件包 nvidia-headless-560-open 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-560 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-560-open 未安装,所以不会被卸载 软件包 nvidia-imex-560 未安装,所以不会被卸载 软件包 nvidia-kernel-common-560 未安装,所以不会被卸载 软件包 nvidia-kernel-open-560 未安装,所以不会被卸载 软件包 nvidia-kernel-source-560 未安装,所以不会被卸载 软件包 nvidia-kernel-source-560-open 未安装,所以不会被卸载 软件包 nvidia-open-560 未安装,所以不会被卸载 软件包 nvidia-utils-560 未安装,所以不会被卸载 软件包 nvidia-firmware-550-550.144.03 未安装,所以不会被卸载 软件包 nvidia-firmware-570-570.86.10 未安装,所以不会被卸载 软件包 nvidia-firmware-570-570.86.15 未安装,所以不会被卸载 软件包 nvidia-firmware-570-570.124.06 未安装,所以不会被卸载 软件包 nvidia-gds-12-8 未安装,所以不会被卸载 软件包 nvidia-hpc-benchmarks-mpich 未安装,所以不会被卸载 软件包 nvidia-hpc-benchmarks-openmpi 未安装,所以不会被卸载 软件包 nvidia-compute-utils-535 未安装,所以不会被卸载 软件包 nvidia-dkms-535 未安装,所以不会被卸载 软件包 nvidia-driver-535 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-535 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-dev-535 未安装,所以不会被卸载 软件包 nvidia-headless-535 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-535 未安装,所以不会被卸载 软件包 nvidia-kernel-common-535 未安装,所以不会被卸载 软件包 nvidia-kernel-open-535 未安装,所以不会被卸载 软件包 nvidia-kernel-source-535 未安装,所以不会被卸载 软件包 nvidia-utils-535 未安装,所以不会被卸载 软件包 nvidia-compute-utils-550 未安装,所以不会被卸载 软件包 nvidia-dkms-550 未安装,所以不会被卸载 软件包 nvidia-dkms-550-open 未安装,所以不会被卸载 软件包 nvidia-driver-550 未安装,所以不会被卸载 软件包 nvidia-driver-550-open 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-550 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-dev-550 未安装,所以不会被卸载 软件包 nvidia-firmware-550-550.163.01 未安装,所以不会被卸载 软件包 nvidia-headless-550 未安装,所以不会被卸载 软件包 nvidia-headless-550-open 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-550 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-550-open 未安装,所以不会被卸载 软件包 nvidia-imex-550 未安装,所以不会被卸载 软件包 nvidia-kernel-common-550 未安装,所以不会被卸载 软件包 nvidia-kernel-open-550 未安装,所以不会被卸载 软件包 nvidia-kernel-source-550 未安装,所以不会被卸载 软件包 nvidia-kernel-source-550-open 未安装,所以不会被卸载 软件包 nvidia-utils-550 未安装,所以不会被卸载 软件包 nvidia-firmware-570-570.133.20 未安装,所以不会被卸载 软件包 nvidia-firmware-575-575.51.03 未安装,所以不会被卸载 软件包 nvidia-kernel-open-575 未安装,所以不会被卸载 软件包 nvidia-kernel-open-570 未安装,所以不会被卸载 软件包 nvidia-container-toolkit 未安装,所以不会被卸载 软件包 nvidia-container-toolkit-base 未安装,所以不会被卸载 软件包 nvidia-driver-575-open 未安装,所以不会被卸载 软件包 nvidia-driver-assistant 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-575 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-dev-575 未安装,所以不会被卸载 软件包 nvidia-imex-575 未安装,所以不会被卸载 软件包 nvidia-open-575 未安装,所以不会被卸载 软件包 nvidia-fs 未安装,所以不会被卸载 软件包 nvidia-fs-dkms 未安装,所以不会被卸载 软件包 nvidia-gds 未安装,所以不会被卸载 软件包 nvidia-gds-12-9 未安装,所以不会被卸载 软件包 nvidia-compute-utils-575 未安装,所以不会被卸载 软件包 nvidia-dkms-575 未安装,所以不会被卸载 软件包 nvidia-dkms-575-open 未安装,所以不会被卸载 软件包 nvidia-driver-575 未安装,所以不会被卸载 软件包 nvidia-firmware-575 未安装,所以不会被卸载 软件包 nvidia-headless-575 未安装,所以不会被卸载 软件包 nvidia-headless-575-open 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-575 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-575-open 未安装,所以不会被卸载 软件包 nvidia-kernel-common-575 未安装,所以不会被卸载 软件包 nvidia-kernel-source-575 未安装,所以不会被卸载 软件包 nvidia-kernel-source-575-open 未安装,所以不会被卸载 软件包 nvidia-modprobe 未安装,所以不会被卸载 软件包 nvidia-open 未安装,所以不会被卸载 软件包 nvidia-settings 未安装,所以不会被卸载 软件包 nvidia-utils-575 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-570 未安装,所以不会被卸载 软件包 nvidia-fabricmanager-dev-570 未安装,所以不会被卸载 软件包 nvidia-firmware-570 未安装,所以不会被卸载 软件包 nvidia-imex-570 未安装,所以不会被卸载 软件包 nvidia-open-570 未安装,所以不会被卸载 软件包 nvidia-persistenced 未安装,所以不会被卸载 软件包 nvidia-xconfig 未安装,所以不会被卸载 软件包 nvidia-340-updates-uvm 未安装,所以不会被卸载 软件包 nvidia-346 未安装,所以不会被卸载 软件包 nvidia-346-dev 未安装,所以不会被卸载 软件包 nvidia-346-updates 未安装,所以不会被卸载 软件包 nvidia-346-updates-dev 未安装,所以不会被卸载 软件包 nvidia-352 未安装,所以不会被卸载 软件包 nvidia-352-dev 未安装,所以不会被卸载 软件包 nvidia-352-updates 未安装,所以不会被卸载 软件包 nvidia-352-updates-dev 未安装,所以不会被卸载 软件包 nvidia-361 未安装,所以不会被卸载 软件包 nvidia-361-dev 未安装,所以不会被卸载 软件包 nvidia-361-updates 未安装,所以不会被卸载 软件包 nvidia-361-updates-dev 未安装,所以不会被卸载 软件包 nvidia-367 未安装,所以不会被卸载 软件包 nvidia-367-dev 未安装,所以不会被卸载 软件包 nvidia-375 未安装,所以不会被卸载 软件包 nvidia-375-dev 未安装,所以不会被卸载 软件包 nvidia-libopencl1-346 未安装,所以不会被卸载 软件包 nvidia-libopencl1-346-updates 未安装,所以不会被卸载 软件包 nvidia-libopencl1-352 未安装,所以不会被卸载 软件包 nvidia-libopencl1-352-updates 未安装,所以不会被卸载 软件包 nvidia-libopencl1-361 未安装,所以不会被卸载 软件包 nvidia-libopencl1-361-updates 未安装,所以不会被卸载 软件包 nvidia-libopencl1-367 未安装,所以不会被卸载 软件包 nvidia-libopencl1-375 未安装,所以不会被卸载 软件包 nvidia-opencl-icd-346 未安装,所以不会被卸载 软件包 nvidia-opencl-icd-346-updates 未安装,所以不会被卸载 软件包 nvidia-opencl-icd-352 未安装,所以不会被卸载 软件包 nvidia-opencl-icd-352-updates 未安装,所以不会被卸载 软件包 nvidia-opencl-icd-361 未安装,所以不会被卸载 软件包 nvidia-opencl-icd-361-updates 未安装,所以不会被卸载 软件包 nvidia-opencl-icd-367 未安装,所以不会被卸载 软件包 nvidia-opencl-icd-375 未安装,所以不会被卸载 软件包 nvidia-compute-utils-545 未安装,所以不会被卸载 软件包 nvidia-compute-utils-570 未安装,所以不会被卸载 软件包 nvidia-dkms-545 未安装,所以不会被卸载 软件包 nvidia-dkms-545-open 未安装,所以不会被卸载 软件包 nvidia-dkms-570 未安装,所以不会被卸载 软件包 nvidia-dkms-570-open 未安装,所以不会被卸载 软件包 nvidia-driver-545 未安装,所以不会被卸载 软件包 nvidia-driver-545-open 未安装,所以不会被卸载 软件包 nvidia-driver-570 未安装,所以不会被卸载 软件包 nvidia-driver-570-open 未安装,所以不会被卸载 软件包 nvidia-firmware-545-545.29.06 未安装,所以不会被卸载 软件包 nvidia-firmware-570-570.169 未安装,所以不会被卸载 软件包 nvidia-headless-545 未安装,所以不会被卸载 软件包 nvidia-headless-545-open 未安装,所以不会被卸载 软件包 nvidia-headless-570 未安装,所以不会被卸载 软件包 nvidia-headless-570-open 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-545 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-545-open 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-570 未安装,所以不会被卸载 软件包 nvidia-headless-no-dkms-570-open 未安装,所以不会被卸载 软件包 nvidia-kernel-common-545 未安装,所以不会被卸载 软件包 nvidia-kernel-common-570 未安装,所以不会被卸载 软件包 nvidia-kernel-source-545 未安装,所以不会被卸载 软件包 nvidia-kernel-source-545-open 未安装,所以不会被卸载 软件包 nvidia-kernel-source-570 未安装,所以不会被卸载 软件包 nvidia-kernel-source-570-open 未安装,所以不会被卸载 软件包 nvidia-utils-545 未安装,所以不会被卸载 软件包 nvidia-utils-570 未安装,所以不会被卸载 这是什么问题
07-13
### 依赖问题的成因解决方式 Ubuntu系统中安装NVIDIA驱动时提示依赖关系未满足,通常是因为软件源配置不当、旧版本驱动残留、内核模块编译环境不一致或Secure Boot启用等原因所致。这类问题在使用`apt`命令安装驱动时尤为常见,部分服务器提供商指出,通过`apt`安装的显卡驱动可能官方提供的`.run`脚本安装的驱动表现不同,特别是在ECC控制等高级功能上存在限制[^1]。 当遇到类似以下错误: ``` nvidia-driver-575 : 依赖: libnvidia-gl-575 (= 575.57.08-0ubuntu1) 但是它将不会被安装 依赖: nvidia-dkms-575 (= 575.57.08-0ubuntu1) 但是它将不会被安装 ... E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。 ``` 表明APT无法自动解析并安装所需的依赖包,这可能是由于软件源中缺少对应版本的驱动组件,或者已安装的其他软件包阻止了这些依赖项的更新。 ### 解决方法 为了解决该类问题,首先应确保系统中没有残留的NVIDIA驱动。执行以下命令卸载现有驱动并禁用开源的`nouveau`驱动: ```bash sudo apt purge '^nvidia-*' sudo apt autoremove sudo apt clean sudo gedit /etc/modprobe.d/blacklist.conf ``` 在打开的文件中添加以下内容以禁用`nouveau`驱动: ``` blacklist nouveau options nouveau modeset=0 ``` 保存后重新生成initramfs并重启系统: ```bash sudo update-initramfs -u sudo reboot ``` 重启后进入TTY终端模式继续安装驱动。接着,建议添加官方推荐的图形驱动PPA源以获取更完整的驱动支持: ```bash sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update ``` 然后查看系统推荐的驱动版本: ```bash ubuntu-drivers devices ``` 根据输出选择合适的驱动进行安装,例如: ```bash sudo apt install nvidia-driver-575 ``` 若仍提示依赖问题未解决,可尝试手动安装缺失的依赖包: ```bash sudo apt install libnvidia-gl-575 nvidia-dkms-575 ``` 此外,GCC和内核版本的一致性也会影响DKMS模块的构建。检查当前GCC版本和内核版本: ```bash gcc --version uname -r ``` 如发现版本不匹配,可通过以下方式切换GCC版本: ```bash sudo update-alternatives --config gcc ``` 如果上述方法无效,可考虑使用NVIDIA官网提供的`.run`格式驱动进行安装: ```bash chmod +x NVIDIA-Linux-x86_64-*.run sudo ./NVIDIA-Linux-x86_64-*.run --dkms ``` 此方式不受APT依赖机制影响,适用于对系统完整性要求较高的场景[^2]。 ### 未安装NVIDIA相关软件包的意义 - **libnvidia-gl-575**:提供NVIDIA GPU用于图形渲染的核心OpenGL库,是桌面环境正常运行的基础依赖之一。 - **nvidia-dkms-575**:包含NVIDIA驱动的动态内核模块支持(Dynamic Kernel Module Support),允许驱动在内核更新后自动重建模块。 - **nvidia-kernel-common-575**:提供通用的内核模块加载工具及配置文件,是驱动模块正确加载的前提条件。 - **libnvidia-compute-575**:包含GPU计算任务所需的基础库函数,常用于CUDA应用开发。 - **nvidia-compute-utils-575**:提供GPU计算相关的辅助工具,如`nvidia-smi`。 - **libnvidia-decode-575 / libnvidia-encode-575**:分别用于视频解码编码加速,广泛应用于多媒体处理场景。 - **nvidia-utils-575**:包含驱动附带的实用程序和文档,有助于维护和调试。 若这些包未能安装,可能导致GPU无法正常工作、性能下降或特定功能不可用。 ### 软件源优化建议 对于依赖问题频繁出现的情况,建议优化APT软件源配置。例如将默认源替换为阿里云镜像,提高下载速度并增加可用包数量: ``` # 阿里源 deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse ``` 修改完成后执行: ```bash sudo apt update && sudo apt upgrade ``` 以确保所有软件包处于最新状态[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值