小编Mar*_*rco的帖子

为什么大多数发行版链接 UEFI 和 grub?

大多数发行版会在 UEFI 系统上安装额外的引导加载程序。UEFI 本身是一个引导加载程序,它提供了一个菜单来选择不同的操作系统或单个内核。此外,UEFI 设置可以使用用户空间工具轻松更改,例如efibootmgr.

内核从 3.3 开始支持 EFI_STUB,这意味着内核可以直接从 UEFI 加载。发行版决定使用额外的引导加载程序的原因是什么?大多数关于 Linux/UEFI 的教程主要关注如何设置额外的引导加载程序(rEFInd、grub2、ELILO 等),而不是使用 EFI_STUB 引导 Linux。

发行版中唯一缺少的是支持。由于大多数发行版链接了第二个引导加载程序,因此内核不会添加到 UEFI 引导菜单,也不会复制到 EFI 系统分区。

三个脚本足以完成所有魔术。一种将 initramfs 复制到 ESP 的方法。第二个将内核复制到 ESP 并在 UEFI 启动菜单中创建一个新条目。第三个脚本从 ESP 中删除旧内核和 initramfs,并删除 UEFI 启动菜单项。这允许完全自动化的内核/initramfs 更新/清除,而无需用户交互。一年多以来,我一直在使用这种方法,并且效果很好。

为什么大多数发行版使用 grub 而不是 EFI_STUB?

链接:

编辑:我不是在谈论完全删除 grub 支持,而是为那些出于各种原因想要使用它的人提供选择。发行版可以grub-efi为那些想要链接 UEFI 和 grub 的人提供一个包,以及一个efistub-boot包含我上面提到的脚本的包。

boot boot-loader grub2 uefi

37
推荐指数
1
解决办法
8167
查看次数

了解 Unix 文件名编码

我很难理解文件名编码是如何工作的。在 unix.SE 上,我发现了相互矛盾的解释。

文件名存储为字符

引用另一个答案: 关于 linux 上文件系统字符编码的几个问题

[...] 正如您在问题中提到的,UNIX 文件名只是一个字符序列;内核对编码一无所知,这完全是一个用户空间(即应用程序级)概念。

如果文件名存储为字符,则必须涉及某种编码,因为最终文件名必须以位或字节序列的形式出现在磁盘上。如果用户可以选择任何编码将字符映射到提供给内核的字节序列,则可以为有效文件名创建任何字节序列。

假设如下: 用户使用随机编码X,将文件foo转换为字节序列? 并将其保存到磁盘。另一个用户使用编码Y。在这种编码中转换为/,不允许作为文件名。但是,对于第一个用户,该文件是有效的。

我认为这种情况不会发生。

文件名存储为二进制 blob

引用另一个答案: Linux 上的文件名和路径使用什么字符集编码?

正如其他人所指出的,对此并没有真正的答案:文件名和路径没有编码;操作系统只处理字节序列。个别应用程序可能会选择将它们解释为以某种方式编码,但这会有所不同。

如果系统不处理字符,如何在文件名中禁止特定字符(例如/NULL)?没有/ 没有编码的概念。

一种解释是文件系统可以存储包含任何 字符的文件名,并且只有考虑编码的用户程序才会阻塞包含无效字符的文件名。反过来,这意味着文件系统和内核可以毫无困难地处理包含/.

我也认为这是错误的。

编码在哪里进行,不允许特定字符的限制在哪里?

character-encoding special-characters filenames locale

26
推荐指数
2
解决办法
1万
查看次数

在vim中自动创建匹配的大括号

如何在vim中自动创建匹配的大括号?

它应该如下工作:如果我输入一个左括号,右括号应该自动出现并且光标应该放在中间。为了跳出大括号对,Ctrl-j使用了组合。

有很多插件提供自动大括号插入。但他们

  • 要么使用Ctrl-j与跳出括号对不同的组合键,要么
  • 干扰UltiSnips键绑定。

以下按预期工作

:inoremap ( ()<Esc>:let leavechar=")"<CR>i
:imap <C-j> <Esc>:exec "normal f" . leavechar<CR>a
Run Code Online (Sandbox Code Playgroud)

但是使用这些设置,UltiSnips 片段不再起作用。所以我使用 UltiSnips 插入右括号:

inoremap ( (<C-R>=UltiSnips_Anon('($1)$0', '(')<CR>
Run Code Online (Sandbox Code Playgroud)

这几乎有效。插入了匹配的大括号,我可以跳过结束的大括号Ctrl-j。但是,这仅在开放式支架前面有空间时才有效。

main () // works, the closing parentheses is added
main(   // fails without a space
Run Code Online (Sandbox Code Playgroud)

我的解决方案要么需要不同的键绑定来跳过右括号,要么需要在打开的前面留一个空间。如何解决这个问题?

注意:我以括号为例。它应该与圆括号、大括号、方括号和小于号一起使用,并且不会干扰 UltiSnips 插件。

vim

18
推荐指数
2
解决办法
1万
查看次数

匹配包含 a-zA-Z 以外字符的单词

匹配一个可以使用的词

\v(\w+)
Run Code Online (Sandbox Code Playgroud)

从 vim 帮助:h \w

\w 单词字符:[0-9A-Za-z_]

这完全按照手册中的描述工作。但是,我想匹配包含超出 字符的单词a-z,例如 prästgården。将正则表达式\v(\w+)prästgården匹配产生三个匹配项,而不是:

prästgården
^^ ^^^ ^^^^
Run Code Online (Sandbox Code Playgroud)

如何匹配包含超出字符的单词a-z?我的语言环境设置为英语,如果可能的话,我想保持这种状态。

编辑:这些词可能不属于单个语言环境,例如

prästgården
tre??
Run Code Online (Sandbox Code Playgroud)

vim regular-expression

18
推荐指数
2
解决办法
8316
查看次数

通过wifi远程更改主机名?

我目前正在访问 TU Wien,今天我使用wpa_supplicant我的家庭研究所的凭据将我的Debian Linux 笔记本电脑连接到他们的 eduroam wlan - 和我访问另一个科学机构时一样。

当我打开一个终端时,我注意到我的命令提示符显示了一个不同的主机名,实际上,执行hostname给了我e244-082.eduroam.tuwien.ac.at而不是我机器的通常主机名x301

我对此感到非常困惑。未经我的同意,连接到 wlan 怎么可能改变我的主机名?

dhcp debian hostname dhclient

16
推荐指数
1
解决办法
1743
查看次数

如何将 samba 共享解析为 IP 地址或主机名

我有一个通过 SAMBA 提供共享的网络中的主机列表。如何确定一台特定主机的 IP 地址或主机名,例如名称为“SASAK02”的主机。

的输出smbtree如下

WORKGROUP
    \\SASAK02               
    \\SAURA-PC1             
    \\PC-VAN-DAMME          
Run Code Online (Sandbox Code Playgroud)

networking samba

14
推荐指数
1
解决办法
3万
查看次数

检查目录是否是挂载点

使用 Python,我扫描 Unix 挂载卷中的文件,然后根据它们的存在添加或清除数据库中的文件名。我刚刚意识到,如果被扫描的卷由于某种原因被卸载,扫描将假定该卷上的每个文件名都应该被清除!哎呀。有没有更好的方法来安装卷或任何建议?

我唯一能想到的就是在扫描前检查的每个卷上放置一个永久虚拟文件,从而确保仅在可以找到虚拟文件时才扫描该卷。

mount

13
推荐指数
2
解决办法
1万
查看次数

如何使 ghostscript 不擦除 PDF 元数据

Ghostscript 会擦除 PDF 元数据等author, title, subject。我如何告诉 ghostscript 不要触摸元数据?我调用它如下:

gs \
  -dBATCH                    \
  -dNOPAUSE                  \
  -sOutputFile=<output_file> \
  -sDEVICE=pdfwrite          \
  -dPDFSETTINGS=/ebook       \
  <input_file>
Run Code Online (Sandbox Code Playgroud)

pdf ghostscript

11
推荐指数
1
解决办法
5104
查看次数

vim 认为什么是一个词?

可能的重复:
匹配包含 a-zA-Z 以外字符的单词

我不明白vim一个词的定义。来自运动的帮助w ( :h w):

w [count] 字数。|独家| 运动。这些命令在单词或 WORDS 上移动。

   *word*
Run Code Online (Sandbox Code Playgroud)

一个单词由一系列字母、数字和下划线或一系列其他非空白字符组成,以空格(空格、制表符、.)分隔。这可以通过 'iskeyword' 选项改变。

这意味着当我调用w动作时,vim 需要检查哪些字符可以在iskeyword选项的帮助下组成一个单词。因此,让我们检查一下,一个单词可能包含哪些字符:

:set iskeyword?
iskeyword=@,48-57,_,192-255
Run Code Online (Sandbox Code Playgroud)

让我们用iskeyword选项中列出的字符中未包含的字符来测试一下,例如U+015B LATIN SMALL LETTER S WITH ACUTE. 按gaon?告诉我们它有十进制值 347,它大于 255,因此超出 iskeyword. 光标放在ttre?? 我按w

tre?? bar
^ (cursor)
Run Code Online (Sandbox Code Playgroud)

结果:

tre?? bar
      ^ (cursor)
Run Code Online (Sandbox Code Playgroud)

如果一个单词可以由字母、数字、下划线和其他字符组成,那么唯一的可能性就是 vim 将 the?视为字母,因为它显然不是数字或下划线。让我们来看看如何判断一个字符是否是一个字母。来自:h :alpha:

支持以下字符类: …

vim

11
推荐指数
1
解决办法
3298
查看次数

在 nautilus 中为特定文件类型设置默认应用程序

我使用 nautilus 作为文件管理器,并希望使用 Vim 而不是 Gedit 来编辑我的文本文件。许多文件(日志文件、空文件……)已经用 Vim 打开,但不是所有文件,例如 tex 文件和 XML 文件仍然用 Gedit 打开。

update-alternatives --get-selections | grep edit 产量

editor                auto     /usr/bin/vim.gnome
gnome-text-editor     manual   /usr/bin/vim.gnome
readline-editor       auto     /usr/bin/rlwrap
Run Code Online (Sandbox Code Playgroud)

并且我还设置了VISUALEDITOR环境变量以指向 vim。

尽管问题是关于更改任何文件类型的默认应用程序,但可以使用仅解决上述更改默认编辑器问题的解决方案来回应,因为这是目前困扰我的问题。

编辑:

“hesse”的答案适用于大多数文件类型,但不适用于所有文件类型。例如 Makefiles 仍然用 Gedit 打开。file --mime-type Makefile返回text/plain,它已包含在~/.local/share/applications/defaults.list. 然而file --mime-type somefile也返回text/plain但是是用 Vim 打开的。

我使用 Debian 不稳定。

defaults nautilus

9
推荐指数
2
解决办法
1万
查看次数