最近我清除了 EFI 系统上的 grub(在您询问之前:我就是不喜欢它)。现在,当我尝试更改 GPU 时,nvidia-settings 和 prime-select 会抛出错误(由于这个“愚蠢”的错误而失败):
Info: selecting the intel profile
Traceback (most recent call last):
File "/usr/bin/prime-select", line 298, in <module>
switcher.enable_profile(arg)
File "/usr/bin/prime-select", line 120, in enable_profile
self._disable_nvidia()
File "/usr/bin/prime-select", line 138, in _disable_nvidia
self._update_grub()
File "/usr/bin/prime-select", line 264, in _update_grub
subprocess.call(['update-grub'])
File "/usr/lib/python3.6/subprocess.py", line 267, in call
with Popen(*popenargs, **kwargs) as p:
File "/usr/lib/python3.6/subprocess.py", line 709, in __init__
restore_signals, start_new_session)
File "/usr/lib/python3.6/subprocess.py", line 1344, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'update-grub': 'update-grub'
他们 (nvidia) 是否真的在脚本中硬编码了 grub 的存在?/usr/bin/prime-select 的第 127-159 行:
def _disable_nvidia(self):
boot_params = {}
# Get the VGA connectors to disable on card1
# in the form of boot parameters
vga_params = self._get_boot_params_from_phantom_vga_connectors()
for elem in vga_params:
elems = elem.split('=')
boot_params[elems[0]] = elems[1]
boot_params['nouveau.runpm'] = '0'
self._add_boot_params(self._grub_cmdline_start, self._grub_path, boot_params)
self._update_grub()
self._blacklist_nvidia()
self._update_initramfs()
self._enable_prime_service()
def _enable_nvidia(self):
self._remove_boot_params(self._grub_cmdline_start,
self._grub_path, ['nouveau.runpm', 'video=VGA'])
self._update_grub()
try:
os.unlink(self._blacklist_file)
except:
pass
self._update_initramfs()
self._disable_prime_service()
def _blacklist_nvidia(self):
...
我不太明白这个脚本的具体作用,在直接责怪 Nvidia 之前想问一下。
或者,如果有人能告诉我哪些行需要注释掉(在 /usr/bin/prime-select 中)才能跳过 grub 内容,我将不胜感激。谢谢!
答案1
嗯,您所使用的 Linux 发行版确实grub
默认使用,并且许多脚本都假定grub
可以使用这些工具来进行普通用户易于使用的更改。
现在,如果你更改了引导加载程序之类的东西(这是发行版的一个重要部分),那么唯一要责怪的就是你。
解决问题的一个简单方法是注释掉subprocess.call(['update-grub'])
并将其替换为pass
,以使该函数_update_grub
不执行任何操作。
def _update_grub(self):
#subprocess.call(['update-grub'])
pass
但是您可能还想交换此功能以更新您正在使用的引导加载程序,以获取最终新生成的初始 ramdisk。
答案2
解决方案是简单地添加一个空文件:/etc/default/grub
现在它起作用了