是否可以判断我的Linux内核是否为自定义(即编译)而不是发行版?


Answers:


13

当然,只要检查是否dpkg知道就可以了。

首先检查您正在运行的内核版本。

uname -a
Linux orwell 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux

然后告诉dpkgdpkg数据库中搜索内核映像文件。

dpkg -S /boot/vmlinuz-3.2.0-4-amd64
linux-image-3.2.0-4-amd64: /boot/vmlinuz-3.2.0-4-amd64

或者,最好dlocatedlocate包装中使用。dlocate首先从dpkg数据库构建一个缓存,然后使用它。所以它很快。

dlocate /boot/vmlinuz-3.2.0-4-amd64
linux-image-3.2.0-4-amd64: /boot/vmlinuz-3.2.0-4-amd64

最后,检查Debian档案文件是否包含此软件包。

apt-cache policy linux-image-3.2.0-4-amd64

linux-image-3.2.0-4-amd64:
  Installed: 3.2.68-1+deb7u1
  Candidate: 3.2.68-1+deb7u1
  Version table:
 *** 3.2.68-1+deb7u1 0
        500 http://security.debian.org/ wheezy/updates/main amd64 Packages
        100 /var/lib/dpkg/status
     3.2.65-1 0
        500 http://httpredir.debian.org/debian/ wheezy/main amd64 Packages

如果他们不这样做,则它是一个自定义程序包。当然,如果dpkg不了解映像文件,那么您的内核根本就不是软件包的一部分,而是已经本地编译的。

请注意,这apt 可以区分Debian归档文件中的软件包与本地编译的同名软件包之间的区别。我认为它会检查软件包的md5sum,但我忘记了它如何执行的细节。二进制软件包包含有关哈希的信息apt-cache show linux-image-3.2.0-4-amd64,例如,请参见的底部。例如

Package: linux-image-3.2.0-4-amd64
Source: linux
Version: 3.2.68-1+deb7u1
Installed-Size: 105729
[...]
Size: 23483788
MD5sum: f9736f30f8b68ae79b2747d8a710ce28
SHA1: 64bfde903892801dccd04b52b12316901a02cd96
SHA256: 775814b3eff4a964b593c0bdeaac20587a4e3ddb1257a9d2bfcf1e9d3b9bfd15

1
请参阅我对exussum答案的评论。如果您只是用不同的选项重新编译了同一个内核,却没有给它起另一个名字,该怎么办?
terdon

@terdon查看修改内容。
Faheem Mitha 2015年

2
啊,是的,哈希应该做到这一点,聪明!
terdon

尽管这种方法在大多数情况下都可以使用,但由于我有一个本地存储软件包的专用存储库,因此在我的系统中不起作用,因此即使使用本地编译的软件包,它也显示为供应商软件包。当然,您可以轻松地发现差异,因为供应商软件包的版本中包含供应商名称,而我的软件包就是我的名字。
hildred

1
@bytefire apt-cache show ...有效。我看错了。现在纠正。
Faheem Mitha 2015年

7

至少,uname -r将给出内核版本,例如3.18.6。但是,在编译内核时,可以在其中配置并附加一个字符串,发行版通常会这样做以指示其自己的补丁程序级别(连字符后)和风味,例如3.18.6-32-generic。这是一个线索。很明显,在创建自定义内核时使用自己的字符串可能是另一种方法。

uname -v 给出一个默认情况下是这样的字符串

#4 SMP PREEMPT Mon Mar 9 13:55:25 EDT 2015

从某种意义上讲,该数目是任意的,即该数目是使用特定的源树构建而未重置该树的内核数,这在您构建自己的树时可能很有用。 SMP表示多任务(即非实时)内核,而PREEMPT是与调度程序的“抢占模型”相关的另一个配置选项。但是这里最重要的线索可能是它的构建时间。请记住,可以使用它来与内核本身的修改/更改时间戳进行匹配,例如可以使用进行更改touch。例如,stat在该内核上如下所示:

  File: ‘3.19-goldilocksSpecial’
  Size: 6858880         Blocks: 13400      IO Block: 4096   regular file
Device: 801h/2049d      Inode: 3156605     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-02-15 15:32:29.000000000 -0500
Modify: 2015-03-03 13:55:21.000000000 -0500
Change: 2015-03-03 14:02:26.767045553 -0500
 Birth: -

这与差不多Mon Mar 9 13:55:25 EDT 2015


2

和其他一样

sudo apt-cache policy linux-generic

是通过软件包管理器安装的版本,

uname -r

比较版本

对我来说

linux-generic:
  Installed: 3.19.0.15.14
  Candidate: 3.19.0.15.14

3.19.0-15-generic

表示相同的版本


1
如果您使用不同的选项重新编译相同的版本,那会改变吗?我不知道为什么在这种情况下版本字符串会更改。
terdon

我不确定会安装2个相同的名称。我没有尝试过。就个人而言,使用不同的选项重新编译时,我从软件包管理器中删除了该版本以消除冲突
exussum 2015年

我猜想相同的名字只会被覆盖/boot。我的观点是,我不明白为什么uname您只是在更改某些选项时重新编译才能期望输出的变化。在这种情况下,我期望apt-cacheuname -r将返回相同的信息,尽管您在本地重新编译。
terdon

@terdon可以在内核配置中自定义版本字符串,如果您使用的是发行版源,那么这是个好主意。
goldilocks 2015年

@goldilocks是的,我在您的回答中看到了这一点,这很有意义。但是,如果我很愚蠢,没有这样做,并且只是重新编译了发行版的股票内核而更改了几个选项,那么版本字符串将完全相同,对吗?您对内部版本数的建议可能会有所帮助,但据我所知,此处没有建议。
terdon

0

我会说,最普遍的正确答案是“不,你不能”。在某些情况下有多种方法可能会有所帮助,并且已经提出了这些方法,但是这些方法似乎都错过了这种情况的实际发生情况。实际上,如果您使用的是自定义内核,则该内核可以执行任何操作,包括隐藏其存在或看起来是另一个内核。

如果您确实正在运行自定义内核并且不知道这一点,我会担心。知道正在使用哪种内核的唯一可靠方法是仔细跟踪编译和安装的内核。

如果您真的不确定系统运行的是哪个内核,或者该内核是从哪个来源构建的,或者它来自哪里,那么我会认真考虑从已知的良好映像中重新安装操作系统,并在以后对尝试和引导的内核更加谨慎。从或使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.